{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "bf955b78",
   "metadata": {},
   "outputs": [],
   "source": [
    "#THIS CODE IS TO BE USED WITH THE PARTIALLY CROPPED TOOTH PIT DATA SET.\n",
    "#FOR THE TOTALLY CROPPED PIT DATA SET USE THE OTHER CODE: 2024 pits 4 carnivores Momocs_Colour_agnostic_croppedOval\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "a5c6de69",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'C:\\\\Users\\\\oscar'"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "%pwd"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "99a6c79e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'C:\\\\Users\\\\oscar'"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import os\n",
    "os.getcwd()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "a05b96ba",
   "metadata": {},
   "outputs": [],
   "source": [
    "os.chdir('C:\\\\Users\\\\oscar\\\\Documents\\\\MOMOCS\\\\FOUR_CARNIVORES\\\\cropped')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "68fe6dbd",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'C:\\\\Users\\\\oscar\\\\Documents\\\\MOMOCS\\\\FOUR_CARNIVORES\\\\cropped'"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "%pwd"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "dd13d7f5",
   "metadata": {},
   "outputs": [],
   "source": [
    "from tensorflow import keras\n",
    "#keras.__version__\n",
    "import os, shutil"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "fffd2e73",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "C:\\Users\\oscar\\Documents\\MOMOCS\\FOUR_CARNIVORES\\cropped\n",
      "C:\\Users\\oscar\\Documents\\MOMOCS\\FOUR_CARNIVORES\\cropped\\conv\n",
      "True\n"
     ]
    }
   ],
   "source": [
    "#create a folder named \"conv2\" in directory\n",
    "original_dir = os.path.abspath('C:\\\\Users\\\\oscar\\\\Documents\\\\MOMOCS\\\\FOUR_CARNIVORES\\\\cropped')\n",
    "# The directory where we will\n",
    "# store our smaller dataset\n",
    "base_dir = os.path.join(original_dir, \"conv\")\n",
    "print(original_dir)\n",
    "print(base_dir)\n",
    "# added by reviewer\n",
    "isdir = os.path.isdir(base_dir) \n",
    "print(isdir) \n",
    "\n",
    "if isdir ==True:\n",
    "    shutil.rmtree(base_dir)\n",
    "\n",
    "os.mkdir(base_dir)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "97901924",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Directories for our training,\n",
    "# validation and test splits\n",
    "train_dir = os.path.join(base_dir, 'train')\n",
    "os.mkdir(train_dir)\n",
    "validation_dir = os.path.join(base_dir, 'validation')\n",
    "os.mkdir(validation_dir)\n",
    "\n",
    "# Directory with our training crocodile pictures\n",
    "train_croc_dir = os.path.join(train_dir, 'CFP')\n",
    "os.mkdir(train_croc_dir)\n",
    "\n",
    "# Directory with our training hyena pictures\n",
    "train_hyena_dir = os.path.join(train_dir, 'HESP')\n",
    "os.mkdir(train_hyena_dir)\n",
    "\n",
    "# Directory with our training leopard pictures\n",
    "train_leop_dir = os.path.join(train_dir, 'LPZP')\n",
    "os.mkdir(train_leop_dir)\n",
    "\n",
    "# Directory with our training lion pictures\n",
    "train_lion_dir = os.path.join(train_dir, 'LZP')\n",
    "os.mkdir(train_lion_dir)\n",
    "\n",
    "\n",
    "# Directory with our validation hyena pictures\n",
    "validation_croc_dir = os.path.join(validation_dir, 'CFP')\n",
    "os.mkdir(validation_croc_dir)\n",
    "\n",
    "# Directory with our validation hyena pictures\n",
    "validation_hyena_dir = os.path.join(validation_dir, 'HESP')\n",
    "os.mkdir(validation_hyena_dir)\n",
    "\n",
    "# Directory with our validation leopard pictures\n",
    "validation_leop_dir = os.path.join(validation_dir, 'LPZP')\n",
    "os.mkdir(validation_leop_dir)\n",
    "\n",
    "# Directory with our validation lion pictures\n",
    "validation_lion_dir = os.path.join(validation_dir, 'LZP')\n",
    "os.mkdir(validation_lion_dir)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "a5a5bf64",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "52\n",
      "['CFP.50.bmp', 'CFP.39.bmp', 'CFP.16.bmp', 'CFP.6.bmp', 'CFP.45.bmp', 'CFP.34.bmp', 'CFP.19.bmp', 'CFP.43.bmp', 'CFP.47.bmp', 'CFP.53.bmp', 'CFP.28.bmp', 'CFP.38.bmp', 'CFP.42.bmp', 'CFP.37.bmp', 'CFP.3.bmp', 'CFP.51.bmp', 'CFP.1.bmp', 'CFP.12.bmp', 'CFP.46.bmp', 'CFP.7.bmp', 'CFP.54.bmp', 'CFP.40.bmp', 'CFP.11.bmp', 'CFP.25.bmp', 'CFP.9.bmp', 'CFP.49.bmp', 'CFP.5.bmp', 'CFP.14.bmp', 'CFP.35.bmp', 'CFP.21.bmp', 'CFP.32.bmp', 'CFP.18.bmp', 'CFP.52.bmp', 'CFP.24.bmp', 'CFP.22.bmp', 'CFP.8.bmp', 'CFP.26.bmp', 'CFP.44.bmp', 'CFP.23.bmp', 'CFP.15.bmp', 'CFP.4.bmp', 'CFP.20.bmp', 'CFP.48.bmp', 'CFP.33.bmp', 'CFP.55.bmp', 'CFP.10.bmp', 'CFP.41.bmp', 'CFP.17.bmp', 'CFP.31.bmp', 'CFP.29.bmp', 'CFP.13.bmp', 'CFP.0.bmp']\n",
      "5\n",
      "['CFP.56.bmp', 'CFP.30.bmp', 'CFP.27.bmp', 'CFP.2.bmp', 'CFP.36.bmp']\n",
      "111\n",
      "['HESP.103.bmp', 'HESP.51.bmp', 'HESP.6.bmp', 'HESP.91.bmp', 'HESP.87.bmp', 'HESP.80.bmp', 'HESP.36.bmp', 'HESP.32.bmp', 'HESP.7.bmp', 'HESP.95.bmp', 'HESP.88.bmp', 'HESP.99.bmp', 'HESP.59.bmp', 'HESP.23.bmp', 'HESP.89.bmp', 'HESP.78.bmp', 'HESP.130.bmp', 'HESP.111.bmp', 'HESP.128.bmp', 'HESP.13.bmp', 'HESP.159.bmp', 'HESP.65.bmp', 'HESP.62.bmp', 'HESP.79.bmp', 'HESP.108.bmp', 'HESP.106.bmp', 'HESP.115.bmp', 'HESP.161.bmp', 'HESP.129.bmp', 'HESP.75.bmp', 'HESP.42.bmp', 'HESP.26.bmp', 'HESP.110.bmp', 'HESP.50.bmp', 'HESP.29.bmp', 'HESP.39.bmp', 'HESP.48.bmp', 'HESP.100.bmp', 'HESP.124.bmp', 'HESP.69.bmp', 'HESP.102.bmp', 'HESP.157.bmp', 'HESP.126.bmp', 'HESP.33.bmp', 'HESP.54.bmp', 'HESP.43.bmp', 'HESP.142.bmp', 'HESP.82.bmp', 'HESP.93.bmp', 'HESP.37.bmp', 'HESP.25.bmp', 'HESP.104.bmp', 'HESP.16.bmp', 'HESP.5.bmp', 'HESP.143.bmp', 'HESP.105.bmp', 'HESP.94.bmp', 'HESP.2.bmp', 'HESP.45.bmp', 'HESP.155.bmp', 'HESP.0.bmp', 'HESP.86.bmp', 'HESP.27.bmp', 'HESP.141.bmp', 'HESP.81.bmp', 'HESP.132.bmp', 'HESP.139.bmp', 'HESP.73.bmp', 'HESP.162.bmp', 'HESP.119.bmp', 'HESP.58.bmp', 'HESP.134.bmp', 'HESP.15.bmp', 'HESP.22.bmp', 'HESP.66.bmp', 'HESP.18.bmp', 'HESP.144.bmp', 'HESP.31.bmp', 'HESP.113.bmp', 'HESP.53.bmp', 'HESP.131.bmp', 'HESP.137.bmp', 'HESP.151.bmp', 'HESP.21.bmp', 'HESP.56.bmp', 'HESP.12.bmp', 'HESP.14.bmp', 'HESP.135.bmp', 'HESP.76.bmp', 'HESP.47.bmp', 'HESP.140.bmp', 'HESP.49.bmp', 'HESP.149.bmp', 'HESP.10.bmp', 'HESP.121.bmp', 'HESP.9.bmp', 'HESP.84.bmp', 'HESP.136.bmp', 'HESP.122.bmp', 'HESP.148.bmp', 'HESP.101.bmp', 'HESP.4.bmp', 'HESP.117.bmp', 'HESP.158.bmp', 'HESP.28.bmp', 'HESP.20.bmp', 'HESP.64.bmp', 'HESP.154.bmp', 'HESP.74.bmp', 'HESP.150.bmp', 'HESP.153.bmp']\n",
      "54\n",
      "['HESP.127.bmp', 'HESP.55.bmp', 'HESP.57.bmp', 'HESP.70.bmp', 'HESP.85.bmp', 'HESP.40.bmp', 'HESP.30.bmp', 'HESP.114.bmp', 'HESP.98.bmp', 'HESP.46.bmp', 'HESP.68.bmp', 'HESP.38.bmp', 'HESP.152.bmp', 'HESP.120.bmp', 'HESP.24.bmp', 'HESP.17.bmp', 'HESP.60.bmp', 'HESP.1.bmp', 'HESP.164.bmp', 'HESP.96.bmp', 'HESP.112.bmp', 'HESP.61.bmp', 'HESP.138.bmp', 'HESP.34.bmp', 'HESP.160.bmp', 'HESP.77.bmp', 'HESP.44.bmp', 'HESP.116.bmp', 'HESP.67.bmp', 'HESP.72.bmp', 'HESP.145.bmp', 'HESP.97.bmp', 'HESP.90.bmp', 'HESP.35.bmp', 'HESP.107.bmp', 'HESP.11.bmp', 'HESP.92.bmp', 'HESP.63.bmp', 'HESP.19.bmp', 'HESP.83.bmp', 'HESP.156.bmp', 'HESP.133.bmp', 'HESP.163.bmp', 'HESP.41.bmp', 'HESP.71.bmp', 'HESP.125.bmp', 'HESP.118.bmp', 'HESP.52.bmp', 'HESP.3.bmp', 'HESP.147.bmp', 'HESP.123.bmp', 'HESP.109.bmp', 'HESP.8.bmp', 'HESP.146.bmp']\n",
      "85\n",
      "['LPZP.39.bmp', 'LPZP.72.bmp', 'LPZP.115.bmp', 'LPZP.29.bmp', 'LPZP.18.bmp', 'LPZP.88.bmp', 'LPZP.117.bmp', 'LPZP.75.bmp', 'LPZP.113.bmp', 'LPZP.109.bmp', 'LPZP.11.bmp', 'LPZP.52.bmp', 'LPZP.27.bmp', 'LPZP.50.bmp', 'LPZP.65.bmp', 'LPZP.49.bmp', 'LPZP.64.bmp', 'LPZP.63.bmp', 'LPZP.44.bmp', 'LPZP.25.bmp', 'LPZP.3.bmp', 'LPZP.43.bmp', 'LPZP.16.bmp', 'LPZP.94.bmp', 'LPZP.93.bmp', 'LPZP.8.bmp', 'LPZP.21.bmp', 'LPZP.112.bmp', 'LPZP.81.bmp', 'LPZP.67.bmp', 'LPZP.13.bmp', 'LPZP.89.bmp', 'LPZP.12.bmp', 'LPZP.79.bmp', 'LPZP.28.bmp', 'LPZP.6.bmp', 'LPZP.7.bmp', 'LPZP.69.bmp', 'LPZP.47.bmp', 'LPZP.23.bmp', 'LPZP.90.bmp', 'LPZP.71.bmp', 'LPZP.101.bmp', 'LPZP.76.bmp', 'LPZP.34.bmp', 'LPZP.107.bmp', 'LPZP.42.bmp', 'LPZP.70.bmp', 'LPZP.19.bmp', 'LPZP.100.bmp', 'LPZP.51.bmp', 'LPZP.2.bmp', 'LPZP.15.bmp', 'LPZP.114.bmp', 'LPZP.14.bmp', 'LPZP.91.bmp', 'LPZP.10.bmp', 'LPZP.32.bmp', 'LPZP.118.bmp', 'LPZP.106.bmp', 'LPZP.37.bmp', 'LPZP.102.bmp', 'LPZP.110.bmp', 'LPZP.60.bmp', 'LPZP.55.bmp', 'LPZP.57.bmp', 'LPZP.40.bmp', 'LPZP.116.bmp', 'LPZP.108.bmp', 'LPZP.68.bmp', 'LPZP.85.bmp', 'LPZP.24.bmp', 'LPZP.82.bmp', 'LPZP.80.bmp', 'LPZP.0.bmp', 'LPZP.74.bmp', 'LPZP.97.bmp', 'LPZP.92.bmp', 'LPZP.78.bmp', 'LPZP.56.bmp', 'LPZP.30.bmp', 'LPZP.87.bmp', 'LPZP.99.bmp', 'LPZP.98.bmp', 'LPZP.84.bmp']\n",
      "36\n",
      "['LPZP.38.bmp', 'LPZP.22.bmp', 'LPZP.58.bmp', 'LPZP.33.bmp', 'LPZP.86.bmp', 'LPZP.36.bmp', 'LPZP.96.bmp', 'LPZP.48.bmp', 'LPZP.45.bmp', 'LPZP.77.bmp', 'LPZP.17.bmp', 'LPZP.53.bmp', 'LPZP.5.bmp', 'LPZP.46.bmp', 'LPZP.95.bmp', 'LPZP.31.bmp', 'LPZP.9.bmp', 'LPZP.41.bmp', 'LPZP.111.bmp', 'LPZP.66.bmp', 'LPZP.119.bmp', 'LPZP.20.bmp', 'LPZP.103.bmp', 'LPZP.83.bmp', 'LPZP.35.bmp', 'LPZP.105.bmp', 'LPZP.62.bmp', 'LPZP.104.bmp', 'LPZP.59.bmp', 'LPZP.26.bmp', 'LPZP.1.bmp', 'LPZP.120.bmp', 'LPZP.61.bmp', 'LPZP.54.bmp', 'LPZP.4.bmp', 'LPZP.73.bmp']\n",
      "84\n",
      "['LZP.39.bmp', 'LZP.72.bmp', 'LZP.115.bmp', 'LZP.29.bmp', 'LZP.18.bmp', 'LZP.88.bmp', 'LZP.117.bmp', 'LZP.75.bmp', 'LZP.113.bmp', 'LZP.109.bmp', 'LZP.11.bmp', 'LZP.52.bmp', 'LZP.27.bmp', 'LZP.50.bmp', 'LZP.65.bmp', 'LZP.49.bmp', 'LZP.64.bmp', 'LZP.63.bmp', 'LZP.44.bmp', 'LZP.25.bmp', 'LZP.3.bmp', 'LZP.43.bmp', 'LZP.16.bmp', 'LZP.94.bmp', 'LZP.93.bmp', 'LZP.8.bmp', 'LZP.21.bmp', 'LZP.112.bmp', 'LZP.81.bmp', 'LZP.67.bmp', 'LZP.13.bmp', 'LZP.89.bmp', 'LZP.12.bmp', 'LZP.79.bmp', 'LZP.28.bmp', 'LZP.6.bmp', 'LZP.7.bmp', 'LZP.69.bmp', 'LZP.47.bmp', 'LZP.23.bmp', 'LZP.90.bmp', 'LZP.71.bmp', 'LZP.101.bmp', 'LZP.76.bmp', 'LZP.34.bmp', 'LZP.107.bmp', 'LZP.42.bmp', 'LZP.70.bmp', 'LZP.19.bmp', 'LZP.100.bmp', 'LZP.51.bmp', 'LZP.2.bmp', 'LZP.15.bmp', 'LZP.114.bmp', 'LZP.14.bmp', 'LZP.91.bmp', 'LZP.10.bmp', 'LZP.32.bmp', 'LZP.118.bmp', 'LZP.106.bmp', 'LZP.37.bmp', 'LZP.102.bmp', 'LZP.110.bmp', 'LZP.60.bmp', 'LZP.55.bmp', 'LZP.57.bmp', 'LZP.40.bmp', 'LZP.116.bmp', 'LZP.108.bmp', 'LZP.68.bmp', 'LZP.85.bmp', 'LZP.24.bmp', 'LZP.82.bmp', 'LZP.80.bmp', 'LZP.0.bmp', 'LZP.74.bmp', 'LZP.97.bmp', 'LZP.92.bmp', 'LZP.78.bmp', 'LZP.56.bmp', 'LZP.30.bmp', 'LZP.87.bmp', 'LZP.99.bmp', 'LZP.98.bmp']\n",
      "37\n",
      "['LZP.84.bmp', 'LZP.38.bmp', 'LZP.22.bmp', 'LZP.58.bmp', 'LZP.33.bmp', 'LZP.86.bmp', 'LZP.36.bmp', 'LZP.96.bmp', 'LZP.48.bmp', 'LZP.45.bmp', 'LZP.77.bmp', 'LZP.17.bmp', 'LZP.53.bmp', 'LZP.5.bmp', 'LZP.46.bmp', 'LZP.95.bmp', 'LZP.31.bmp', 'LZP.9.bmp', 'LZP.41.bmp', 'LZP.111.bmp', 'LZP.66.bmp', 'LZP.119.bmp', 'LZP.20.bmp', 'LZP.103.bmp', 'LZP.83.bmp', 'LZP.35.bmp', 'LZP.105.bmp', 'LZP.62.bmp', 'LZP.104.bmp', 'LZP.59.bmp', 'LZP.26.bmp', 'LZP.1.bmp', 'LZP.120.bmp', 'LZP.61.bmp', 'LZP.54.bmp', 'LZP.4.bmp', 'LZP.73.bmp']\n"
     ]
    }
   ],
   "source": [
    "#USE THIS ONE\n",
    "\n",
    "from tensorflow.keras.preprocessing.image import ImageDataGenerator\n",
    "# randomize order of image locations\n",
    "# this will help model in not being data sequence dependent\n",
    "\n",
    "# Copy first CM images to train_lion_dir\n",
    "import random\n",
    "    \n",
    "    \n",
    "# Copy first TM images to train_croc_dir # \n",
    "fnames = ['CFP.{}.bmp'.format(i) for i in range(57)]\n",
    "random.seed(10)\n",
    "random.shuffle(fnames)\n",
    "fnamest = fnames[0:52]\n",
    "print(len(fnamest))\n",
    "print(fnamest)\n",
    "\n",
    "for fname in fnamest:\n",
    "    src = os.path.join(original_dir, fname)\n",
    "    dst = os.path.join(train_croc_dir, fname)\n",
    "    shutil.copyfile(src, dst)\n",
    "        \n",
    "# Copy next TM images to validation_croc_dir\n",
    "fnamesv = fnames[52:57]\n",
    "print(len(fnamesv))\n",
    "print(fnamesv)\n",
    "for fname in fnamesv:\n",
    "    src = os.path.join(original_dir, fname)\n",
    "    dst = os.path.join(validation_croc_dir, fname)\n",
    "    shutil.copyfile(src, dst)\n",
    "    \n",
    "    \n",
    "    \n",
    "# Copy first TM images to train_hyena_dir # \n",
    "fnames = ['HESP.{}.bmp'.format(i) for i in range(165)]\n",
    "random.seed(10)\n",
    "random.shuffle(fnames)\n",
    "fnamest = fnames[0:111]\n",
    "print(len(fnamest))\n",
    "print(fnamest)\n",
    "\n",
    "for fname in fnamest:\n",
    "    src = os.path.join(original_dir, fname)\n",
    "    dst = os.path.join(train_hyena_dir, fname)\n",
    "    shutil.copyfile(src, dst)\n",
    "        \n",
    "# Copy next 10 TM images to validation_hip_dir\n",
    "fnamesv = fnames[111:165]\n",
    "print(len(fnamesv))\n",
    "print(fnamesv)\n",
    "for fname in fnamesv:\n",
    "    src = os.path.join(original_dir, fname)\n",
    "    dst = os.path.join(validation_hyena_dir, fname)\n",
    "    shutil.copyfile(src, dst)\n",
    "    \n",
    "    \n",
    "    \n",
    "# Copy first TM images to train_leop_dir # \n",
    "fnames = ['LPZP.{}.bmp'.format(i) for i in range(121)]\n",
    "random.seed(10)\n",
    "random.shuffle(fnames)\n",
    "fnamest = fnames[0:85]\n",
    "print(len(fnamest))\n",
    "print(fnamest)\n",
    "\n",
    "for fname in fnamest:\n",
    "    src = os.path.join(original_dir, fname)\n",
    "    dst = os.path.join(train_leop_dir, fname)\n",
    "    shutil.copyfile(src, dst)\n",
    "        \n",
    "# Copy next 10 TM images to validation_leop_dir\n",
    "fnamesv = fnames[85:121]\n",
    "print(len(fnamesv))\n",
    "print(fnamesv)\n",
    "for fname in fnamesv:\n",
    "    src = os.path.join(original_dir, fname)\n",
    "    dst = os.path.join(validation_leop_dir, fname)\n",
    "    shutil.copyfile(src, dst)\n",
    "         \n",
    "        \n",
    "\n",
    "\n",
    "# Copy first TM images to train_lion_dir # \n",
    "fnames = ['LZP.{}.bmp'.format(i) for i in range(121)]\n",
    "random.seed(10)\n",
    "random.shuffle(fnames)\n",
    "fnamest = fnames[0:84]\n",
    "print(len(fnamest))\n",
    "print(fnamest)\n",
    "\n",
    "for fname in fnamest:\n",
    "    src = os.path.join(original_dir, fname)\n",
    "    dst = os.path.join(train_lion_dir, fname)\n",
    "    shutil.copyfile(src, dst)\n",
    "        \n",
    "# Copy next 10 TM images to validation_red_dir\n",
    "fnamesv = fnames[84:121]\n",
    "print(len(fnamesv))\n",
    "print(fnamesv)\n",
    "for fname in fnamesv:\n",
    "    src = os.path.join(original_dir, fname)\n",
    "    dst = os.path.join(validation_lion_dir, fname)\n",
    "    shutil.copyfile(src, dst)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "bf1b1c84",
   "metadata": {},
   "outputs": [],
   "source": [
    "#training and testing sets"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d3fac3f4",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "### Colour agnostic implementation"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "8984506e",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "id": "2b012e82",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import tensorflow as tf\n",
    "from tensorflow.keras.preprocessing.image import ImageDataGenerator\n",
    "#from tensorflow.keras.applications.resnet50 import preprocess_input\n",
    "#from tensorflow.keras.applications.densenet import preprocess_input\n",
    "from tensorflow.keras.applications.vgg19 import preprocess_input\n",
    "import cv2\n",
    "\n",
    "def random_hue_brightness_saturation(image):\n",
    "    # Convert the image to HSV\n",
    "    hsv_image = cv2.cvtColor(image, cv2.COLOR_RGB2HSV)\n",
    "    \n",
    "    # Randomly choose which adjustment to apply\n",
    "    random_value = np.random.randint(0, 3)\n",
    "    \n",
    "    if random_value == 0:\n",
    "        # Randomly adjust hue\n",
    "        hue_shift = np.random.uniform(-10, 10)\n",
    "        hsv_image[:, :, 0] = (hsv_image[:, :, 0] + hue_shift) % 180\n",
    "    elif random_value == 1:\n",
    "        # Randomly adjust saturation\n",
    "        saturation_scale = np.random.uniform(0.8, 1.2)\n",
    "        hsv_image[:, :, 1] = np.clip(hsv_image[:, :, 1] * saturation_scale, 0, 255)\n",
    "    else:\n",
    "        # Randomly adjust brightness\n",
    "        brightness_scale = np.random.uniform(0.8, 1.2)\n",
    "        hsv_image[:, :, 2] = np.clip(hsv_image[:, :, 2] * brightness_scale, 0, 255)\n",
    "    \n",
    "    # Convert back to RGB\n",
    "    augmented_image = cv2.cvtColor(hsv_image, cv2.COLOR_HSV2RGB)\n",
    "    \n",
    "    # Apply ResNet50 preprocessing\n",
    "    augmented_image = preprocess_input(augmented_image)\n",
    "    \n",
    "    return augmented_image"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "6e2c7e3a",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "id": "51baa7a7",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Found 332 images belonging to 4 classes.\n",
      "Found 132 images belonging to 4 classes.\n"
     ]
    }
   ],
   "source": [
    "#from tensorflow.keras.applications.densenet import preprocess_input #for RESNET 50\n",
    "#from keras.applications.imagenet_utils import decode_predictions, preprocess_input#for efficient Net\n",
    "#from tensorflow.keras.applications.imagenet_utils import decode_predictions, preprocess_input#for efficient Net\n",
    "\n",
    "#Let's train our network using data augmentation and dropout:\n",
    "train_datagen = ImageDataGenerator(\n",
    "    rotation_range=40,\n",
    "    width_shift_range=0.2,\n",
    "    height_shift_range=0.2,\n",
    "    shear_range=0.2,\n",
    "    zoom_range=0.2,\n",
    "    horizontal_flip=True,\n",
    "    preprocessing_function=random_hue_brightness_saturation)#OJO!!!! imagenet_utils for Efficient Net\n",
    "\n",
    "# Note that the validation data should not be augmented!\n",
    "test_datagen = ImageDataGenerator(preprocessing_function= \\\n",
    "    keras.applications.vgg19.preprocess_input)#OJO!!!\n",
    "\n",
    "train_generator = train_datagen.flow_from_directory(\n",
    "        # This is the target directory\n",
    "        train_dir,\n",
    "        # All images will be resized \n",
    "        target_size=(250, 200),\n",
    "        batch_size=32,\n",
    "        class_mode='categorical')#put \"categorical\" si son más de 2 categorías\n",
    "\n",
    "validation_generator = test_datagen.flow_from_directory(\n",
    "        validation_dir,\n",
    "        target_size=(250, 200),\n",
    "        batch_size=20,\n",
    "        class_mode='categorical',\n",
    "        shuffle=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "id": "ec22b468",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Found 332 images belonging to 4 classes.\n",
      "Found 132 images belonging to 4 classes.\n",
      "(332, 250, 200, 3) train samples\n",
      "(132, 250, 200, 3) test samples\n"
     ]
    }
   ],
   "source": [
    "datagenTrain=train_datagen.flow_from_directory(\n",
    "        # This is the target directory\n",
    "        train_dir,\n",
    "        # All images will be resized to 40x160\n",
    "        target_size=(250,200),\n",
    "        batch_size=332,\n",
    "        # Since we use binary_crossentropy loss, we need binary labels\n",
    "        class_mode='categorical')\n",
    "datagenTest=test_datagen.flow_from_directory(\n",
    "        # This is the target directory\n",
    "        validation_dir,\n",
    "        # All images will be resized to 40x160\n",
    "        target_size=(250, 200),\n",
    "        batch_size=132,\n",
    "        # Since we use binary_crossentropy loss, we need binary labels\n",
    "        class_mode='categorical',\n",
    "        shuffle=False)\n",
    "x_train, y_train = next(datagenTrain)\n",
    "x_test, y_test = next(datagenTest)\n",
    "print(x_train.shape, 'train samples')\n",
    "print(x_test.shape, 'test samples')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "022ee854",
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "995f9b2e",
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "#MODULE 2: CHOOSE MODEL"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "id": "857e863a",
   "metadata": {},
   "outputs": [],
   "source": [
    "# For adding new activation function\n",
    "from keras.layers import Activation\n",
    "from keras import backend as K\n",
    "from tensorflow.python.keras.utils.generic_utils import get_custom_objects\n",
    "#from keras.utils.generic_utils import get_custom_objects\n",
    "def swish(x):\n",
    "    return (K.sigmoid(x) * x)\n",
    "\n",
    "get_custom_objects().update({'swish': Activation(swish)})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "da6bb8db",
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "#activate Dropout "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "id": "487ab902",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "WARNING:absl:`lr` is deprecated in Keras optimizer, please use `learning_rate` or use the legacy optimizer, e.g.,tf.keras.optimizers.legacy.Adagrad.\n"
     ]
    }
   ],
   "source": [
    "# Vgg19 for transfer learning with Dropout\n",
    "import sys\n",
    "\n",
    "from matplotlib import pyplot\n",
    "from tensorflow.keras.applications.vgg19 import VGG19\n",
    "from keras.models import Model\n",
    "from keras.layers import Dense\n",
    "from keras.layers import Flatten\n",
    "from keras.layers import Dropout\n",
    "#from keras.optimizers import SGD\n",
    "from keras.optimizers import Adagrad\n",
    "from keras.preprocessing.image import ImageDataGenerator\n",
    "\n",
    "\n",
    "\n",
    "# define cnn model\n",
    "def define_model():\n",
    "\t# load model\n",
    "\tmodel = VGG19(include_top=False, input_shape=(250, 200, 3))\n",
    "\t# mark loaded layers as not trainable\n",
    "\tfor layer in model.layers:\n",
    "\t\tlayer.trainable = False\n",
    "\t# add new classifier layers\n",
    "\tflat1 = Flatten()(model.layers[-1].output)\n",
    "\tclass1 = Dense(128, activation='swish', kernel_initializer='he_uniform')(flat1)\n",
    "\tdrop=Dropout(0.3)(class1)\n",
    "\toutput = Dense(4, activation='softmax')(drop)\n",
    "\t# define new model\n",
    "\tmodel = Model(inputs=model.inputs, outputs=output)\n",
    "\t# compile model\n",
    "\t#opt = SGD(lr=0.001, momentum=0.9)\n",
    "\topt = Adagrad (lr=0.001)\n",
    "\tmodel.compile(optimizer=opt, loss='categorical_crossentropy', metrics=['accuracy'])\n",
    "\treturn model\n",
    "\n",
    "# define model\n",
    "model = define_model()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "4fd3cd39",
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "id": "eb0b0fba",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "WARNING:absl:`lr` is deprecated in Keras optimizer, please use `learning_rate` or use the legacy optimizer, e.g.,tf.keras.optimizers.legacy.Adagrad.\n"
     ]
    }
   ],
   "source": [
    "# for transfer learning RESNET50 with Dropout\n",
    "#import sys\n",
    "#from matplotlib import pyplot\n",
    "from tensorflow.keras.applications.resnet50 import ResNet50\n",
    "from tensorflow.keras.models import Model\n",
    "from tensorflow.keras.layers import Dense\n",
    "from tensorflow.keras.layers import Flatten\n",
    "from tensorflow.keras.layers import Dropout\n",
    "from tensorflow.keras.optimizers import SGD\n",
    "from tensorflow.keras.optimizers import Adagrad\n",
    "from tensorflow.keras.preprocessing.image import ImageDataGenerator\n",
    "\n",
    "# define cnn model\n",
    "def define_model():\n",
    "\t# load model\n",
    "\tmodel = ResNet50(include_top=False, input_shape=(250, 200, 3))\n",
    "\t# mark loaded layers as not trainable\n",
    "\tfor layer in model.layers:\n",
    "\t\tlayer.trainable = False\n",
    "\t# add new classifier layers\n",
    "\tflat1 = Flatten()(model.layers[-1].output)\n",
    "\tclass1 = Dense(128, activation='relu', kernel_initializer='he_uniform')(flat1)\n",
    "\tdrop=Dropout(0.3)(class1)\n",
    "\toutput = Dense(4, activation='softmax')(drop)\n",
    "\t# define new model\n",
    "\tmodel = Model(inputs=model.inputs, outputs=output)\n",
    "\t# compile model\n",
    "\t#opt = SGD(lr=0.001, momentum=0.9)\n",
    "\topt = Adagrad(lr=0.001)\n",
    "\tmodel.compile(optimizer=opt, loss='categorical_crossentropy', metrics=['accuracy'])\n",
    "\treturn model\n",
    "\n",
    "# define model\n",
    "model = define_model()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "5ea2e84a",
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "id": "3469f2bd",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "WARNING:absl:`lr` is deprecated in Keras optimizer, please use `learning_rate` or use the legacy optimizer, e.g.,tf.keras.optimizers.legacy.Adagrad.\n"
     ]
    }
   ],
   "source": [
    "# for transfer learning DENSENET with Dropout\n",
    "import sys\n",
    "from matplotlib import pyplot\n",
    "from tensorflow.keras.applications.densenet import DenseNet201\n",
    "from keras.models import Model\n",
    "from keras.layers import Dense\n",
    "from keras.layers import Flatten\n",
    "from keras.layers import Dropout\n",
    "from keras.optimizers import SGD\n",
    "from keras.optimizers import Adagrad\n",
    "from keras.preprocessing.image import ImageDataGenerator\n",
    "\n",
    "# define cnn model\n",
    "def define_model():\n",
    "\t# load model\n",
    "\tmodel = DenseNet201(include_top=False, input_shape=(250, 200, 3))\n",
    "\t# mark loaded layers as not trainable\n",
    "\tfor layer in model.layers:\n",
    "\t\tlayer.trainable = False\n",
    "\t# add new classifier layers\n",
    "\tflat1 = Flatten()(model.layers[-1].output)\n",
    "\tclass1 = Dense(128, activation='relu', kernel_initializer='he_uniform')(flat1)\n",
    "\tdrop=Dropout(0.3)(class1)\n",
    "\toutput = Dense(4, activation='softmax')(drop)\n",
    "\t# define new model\n",
    "\tmodel = Model(inputs=model.inputs, outputs=output)\n",
    "\t# compile \n",
    "\t#opt = SGD(lr=0.001, momentum=0.9)   \n",
    "\topt = Adagrad(lr=0.001)\n",
    "\tmodel.compile(optimizer=opt, loss='categorical_crossentropy', metrics=['accuracy'])\n",
    "\treturn model\n",
    "\n",
    "# define model\n",
    "model = define_model()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 96,
   "id": "b81fa27c",
   "metadata": {},
   "outputs": [],
   "source": [
    "#RUN MODEL:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "id": "d01755ee",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\oscar\\AppData\\Local\\Temp\\ipykernel_40624\\3173433236.py:2: UserWarning: `Model.fit_generator` is deprecated and will be removed in a future version. Please use `Model.fit`, which supports generators.\n",
      "  history = model.fit_generator(\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/100\n",
      "10/10 [==============================] - 26s 3s/step - loss: 6.6216 - accuracy: 0.3400 - val_loss: 2.0693 - val_accuracy: 0.2667\n",
      "Epoch 2/100\n",
      "10/10 [==============================] - 27s 3s/step - loss: 1.9266 - accuracy: 0.4000 - val_loss: 1.3331 - val_accuracy: 0.3833\n",
      "Epoch 3/100\n",
      "10/10 [==============================] - 27s 3s/step - loss: 1.4211 - accuracy: 0.4333 - val_loss: 1.1155 - val_accuracy: 0.5167\n",
      "Epoch 4/100\n",
      "10/10 [==============================] - 27s 3s/step - loss: 1.2966 - accuracy: 0.4533 - val_loss: 1.0924 - val_accuracy: 0.4583\n",
      "Epoch 5/100\n",
      "10/10 [==============================] - 27s 3s/step - loss: 1.1568 - accuracy: 0.5200 - val_loss: 1.0558 - val_accuracy: 0.5000\n",
      "Epoch 6/100\n",
      "10/10 [==============================] - 27s 3s/step - loss: 1.2040 - accuracy: 0.5133 - val_loss: 0.9944 - val_accuracy: 0.5500\n",
      "Epoch 7/100\n",
      "10/10 [==============================] - 27s 3s/step - loss: 1.2251 - accuracy: 0.5000 - val_loss: 0.9501 - val_accuracy: 0.5667\n",
      "Epoch 8/100\n",
      "10/10 [==============================] - 27s 3s/step - loss: 1.1131 - accuracy: 0.4867 - val_loss: 0.9503 - val_accuracy: 0.5750\n",
      "Epoch 9/100\n",
      "10/10 [==============================] - 27s 3s/step - loss: 1.1241 - accuracy: 0.4767 - val_loss: 0.9434 - val_accuracy: 0.6083\n",
      "Epoch 10/100\n",
      "10/10 [==============================] - 27s 3s/step - loss: 1.1695 - accuracy: 0.4867 - val_loss: 0.9411 - val_accuracy: 0.5750\n",
      "Epoch 11/100\n",
      "10/10 [==============================] - 27s 3s/step - loss: 1.0678 - accuracy: 0.4933 - val_loss: 0.8990 - val_accuracy: 0.6250\n",
      "Epoch 12/100\n",
      "10/10 [==============================] - 28s 3s/step - loss: 1.0587 - accuracy: 0.5867 - val_loss: 0.8694 - val_accuracy: 0.6083\n",
      "Epoch 13/100\n",
      "10/10 [==============================] - 27s 3s/step - loss: 1.0401 - accuracy: 0.5167 - val_loss: 0.8475 - val_accuracy: 0.6167\n",
      "Epoch 14/100\n",
      "10/10 [==============================] - 27s 3s/step - loss: 1.0823 - accuracy: 0.5467 - val_loss: 0.8859 - val_accuracy: 0.6083\n",
      "Epoch 15/100\n",
      "10/10 [==============================] - 27s 3s/step - loss: 0.9923 - accuracy: 0.5800 - val_loss: 0.8584 - val_accuracy: 0.6083\n",
      "Epoch 16/100\n",
      "10/10 [==============================] - 27s 3s/step - loss: 0.9199 - accuracy: 0.6033 - val_loss: 0.8408 - val_accuracy: 0.6333\n",
      "Epoch 17/100\n",
      "10/10 [==============================] - 27s 3s/step - loss: 1.0124 - accuracy: 0.6100 - val_loss: 0.8330 - val_accuracy: 0.6417\n",
      "Epoch 18/100\n",
      "10/10 [==============================] - 27s 3s/step - loss: 0.9892 - accuracy: 0.5633 - val_loss: 0.8272 - val_accuracy: 0.6583\n",
      "Epoch 19/100\n",
      "10/10 [==============================] - 29s 3s/step - loss: 0.9421 - accuracy: 0.6094 - val_loss: 0.7932 - val_accuracy: 0.6667\n",
      "Epoch 20/100\n",
      "10/10 [==============================] - 27s 3s/step - loss: 0.9716 - accuracy: 0.5967 - val_loss: 0.7945 - val_accuracy: 0.6417\n",
      "Epoch 21/100\n",
      "10/10 [==============================] - 28s 3s/step - loss: 0.9057 - accuracy: 0.6167 - val_loss: 0.7788 - val_accuracy: 0.6417\n",
      "Epoch 22/100\n",
      "10/10 [==============================] - 27s 3s/step - loss: 0.9334 - accuracy: 0.6133 - val_loss: 0.7876 - val_accuracy: 0.6500\n",
      "Epoch 23/100\n",
      "10/10 [==============================] - 27s 3s/step - loss: 0.9568 - accuracy: 0.6200 - val_loss: 0.7907 - val_accuracy: 0.6833\n",
      "Epoch 24/100\n",
      "10/10 [==============================] - 30s 3s/step - loss: 0.9443 - accuracy: 0.5833 - val_loss: 0.8045 - val_accuracy: 0.6667\n",
      "Epoch 25/100\n",
      "10/10 [==============================] - 32s 3s/step - loss: 0.9082 - accuracy: 0.6067 - val_loss: 0.7854 - val_accuracy: 0.6750\n",
      "Epoch 26/100\n",
      "10/10 [==============================] - 33s 3s/step - loss: 0.9248 - accuracy: 0.6267 - val_loss: 0.7835 - val_accuracy: 0.6750\n",
      "Epoch 27/100\n",
      "10/10 [==============================] - 34s 3s/step - loss: 0.8110 - accuracy: 0.6533 - val_loss: 0.7642 - val_accuracy: 0.6750\n",
      "Epoch 28/100\n",
      "10/10 [==============================] - 35s 3s/step - loss: 0.9067 - accuracy: 0.5933 - val_loss: 0.7916 - val_accuracy: 0.6583\n",
      "Epoch 29/100\n",
      "10/10 [==============================] - 35s 4s/step - loss: 0.9034 - accuracy: 0.6467 - val_loss: 0.7752 - val_accuracy: 0.6667\n",
      "Epoch 30/100\n",
      "10/10 [==============================] - 37s 4s/step - loss: 0.9187 - accuracy: 0.6167 - val_loss: 0.7943 - val_accuracy: 0.6500\n",
      "Epoch 31/100\n",
      "10/10 [==============================] - 36s 4s/step - loss: 0.8802 - accuracy: 0.6200 - val_loss: 0.8011 - val_accuracy: 0.6667\n",
      "Epoch 32/100\n",
      "10/10 [==============================] - 37s 4s/step - loss: 0.8534 - accuracy: 0.6633 - val_loss: 0.7575 - val_accuracy: 0.6833\n",
      "Epoch 33/100\n",
      "10/10 [==============================] - 37s 4s/step - loss: 0.8543 - accuracy: 0.6500 - val_loss: 0.7630 - val_accuracy: 0.6750\n",
      "Epoch 34/100\n",
      "10/10 [==============================] - 37s 4s/step - loss: 0.7994 - accuracy: 0.6500 - val_loss: 0.7519 - val_accuracy: 0.6833\n",
      "Epoch 35/100\n",
      "10/10 [==============================] - 39s 4s/step - loss: 0.9156 - accuracy: 0.6562 - val_loss: 0.7389 - val_accuracy: 0.6833\n",
      "Epoch 36/100\n",
      "10/10 [==============================] - 37s 4s/step - loss: 0.8045 - accuracy: 0.6333 - val_loss: 0.7386 - val_accuracy: 0.6750\n",
      "Epoch 37/100\n",
      "10/10 [==============================] - 39s 4s/step - loss: 0.8275 - accuracy: 0.6375 - val_loss: 0.7233 - val_accuracy: 0.7083\n",
      "Epoch 38/100\n",
      "10/10 [==============================] - 37s 4s/step - loss: 0.8313 - accuracy: 0.6500 - val_loss: 0.7155 - val_accuracy: 0.6917\n",
      "Epoch 39/100\n",
      "10/10 [==============================] - 34s 4s/step - loss: 0.8224 - accuracy: 0.6333 - val_loss: 0.7123 - val_accuracy: 0.6917\n",
      "Epoch 40/100\n",
      "10/10 [==============================] - 26s 3s/step - loss: 0.8141 - accuracy: 0.6633 - val_loss: 0.7173 - val_accuracy: 0.7167\n",
      "Epoch 41/100\n",
      "10/10 [==============================] - 27s 3s/step - loss: 0.7445 - accuracy: 0.6733 - val_loss: 0.7127 - val_accuracy: 0.7167\n",
      "Epoch 42/100\n",
      "10/10 [==============================] - 27s 3s/step - loss: 0.7959 - accuracy: 0.6667 - val_loss: 0.7156 - val_accuracy: 0.7000\n",
      "Epoch 43/100\n",
      "10/10 [==============================] - 27s 3s/step - loss: 0.7663 - accuracy: 0.6900 - val_loss: 0.7013 - val_accuracy: 0.7000\n",
      "Epoch 44/100\n",
      "10/10 [==============================] - 27s 3s/step - loss: 0.7517 - accuracy: 0.6567 - val_loss: 0.6992 - val_accuracy: 0.7000\n",
      "Epoch 45/100\n",
      "10/10 [==============================] - 27s 3s/step - loss: 0.8086 - accuracy: 0.6700 - val_loss: 0.7025 - val_accuracy: 0.6917\n",
      "Epoch 46/100\n",
      "10/10 [==============================] - 27s 3s/step - loss: 0.7161 - accuracy: 0.7100 - val_loss: 0.6857 - val_accuracy: 0.7000\n",
      "Epoch 47/100\n",
      "10/10 [==============================] - 27s 3s/step - loss: 0.7800 - accuracy: 0.6633 - val_loss: 0.6914 - val_accuracy: 0.7000\n",
      "Epoch 48/100\n",
      "10/10 [==============================] - 27s 3s/step - loss: 0.7690 - accuracy: 0.6667 - val_loss: 0.6942 - val_accuracy: 0.7000\n",
      "Epoch 49/100\n",
      "10/10 [==============================] - 27s 3s/step - loss: 0.7637 - accuracy: 0.6467 - val_loss: 0.6962 - val_accuracy: 0.7083\n",
      "Epoch 50/100\n",
      "10/10 [==============================] - 27s 3s/step - loss: 0.7719 - accuracy: 0.7167 - val_loss: 0.6857 - val_accuracy: 0.7250\n",
      "Epoch 51/100\n",
      "10/10 [==============================] - 27s 3s/step - loss: 0.8079 - accuracy: 0.6600 - val_loss: 0.6997 - val_accuracy: 0.7167\n",
      "Epoch 52/100\n",
      "10/10 [==============================] - 27s 3s/step - loss: 0.7507 - accuracy: 0.6700 - val_loss: 0.6888 - val_accuracy: 0.7167\n",
      "Epoch 53/100\n",
      "10/10 [==============================] - 27s 3s/step - loss: 0.6946 - accuracy: 0.7133 - val_loss: 0.6736 - val_accuracy: 0.7083\n",
      "Epoch 54/100\n",
      "10/10 [==============================] - 28s 3s/step - loss: 0.6887 - accuracy: 0.7281 - val_loss: 0.6936 - val_accuracy: 0.7000\n",
      "Epoch 55/100\n",
      "10/10 [==============================] - 28s 3s/step - loss: 0.6990 - accuracy: 0.6750 - val_loss: 0.6972 - val_accuracy: 0.7083\n",
      "Epoch 56/100\n",
      "10/10 [==============================] - 27s 3s/step - loss: 0.7854 - accuracy: 0.6800 - val_loss: 0.6890 - val_accuracy: 0.7083\n",
      "Epoch 57/100\n",
      "10/10 [==============================] - 27s 3s/step - loss: 0.7404 - accuracy: 0.7000 - val_loss: 0.6966 - val_accuracy: 0.7250\n",
      "Epoch 58/100\n",
      "10/10 [==============================] - 28s 3s/step - loss: 0.7013 - accuracy: 0.7133 - val_loss: 0.6919 - val_accuracy: 0.7167\n",
      "Epoch 59/100\n",
      "10/10 [==============================] - 28s 3s/step - loss: 0.7254 - accuracy: 0.6933 - val_loss: 0.7040 - val_accuracy: 0.7167\n",
      "Epoch 60/100\n",
      "10/10 [==============================] - 27s 3s/step - loss: 0.7223 - accuracy: 0.6833 - val_loss: 0.7090 - val_accuracy: 0.7000\n",
      "Epoch 61/100\n",
      "10/10 [==============================] - 27s 3s/step - loss: 0.7456 - accuracy: 0.6867 - val_loss: 0.7211 - val_accuracy: 0.7000\n",
      "Epoch 62/100\n",
      "10/10 [==============================] - 28s 3s/step - loss: 0.6950 - accuracy: 0.6969 - val_loss: 0.7196 - val_accuracy: 0.7000\n",
      "Epoch 63/100\n",
      "10/10 [==============================] - 27s 3s/step - loss: 0.6685 - accuracy: 0.7367 - val_loss: 0.7116 - val_accuracy: 0.7083\n",
      "Epoch 64/100\n",
      "10/10 [==============================] - 27s 3s/step - loss: 0.7099 - accuracy: 0.7067 - val_loss: 0.7176 - val_accuracy: 0.7083\n",
      "Epoch 65/100\n",
      "10/10 [==============================] - 27s 3s/step - loss: 0.7530 - accuracy: 0.7233 - val_loss: 0.7036 - val_accuracy: 0.7167\n",
      "Epoch 66/100\n",
      "10/10 [==============================] - 27s 3s/step - loss: 0.6231 - accuracy: 0.7200 - val_loss: 0.7060 - val_accuracy: 0.7167\n",
      "Epoch 67/100\n",
      "10/10 [==============================] - 27s 3s/step - loss: 0.7541 - accuracy: 0.7033 - val_loss: 0.7179 - val_accuracy: 0.6917\n",
      "Epoch 68/100\n",
      "10/10 [==============================] - 29s 3s/step - loss: 0.6348 - accuracy: 0.7375 - val_loss: 0.7080 - val_accuracy: 0.7167\n",
      "Epoch 69/100\n",
      "10/10 [==============================] - 27s 3s/step - loss: 0.7351 - accuracy: 0.6767 - val_loss: 0.7026 - val_accuracy: 0.7167\n",
      "Epoch 70/100\n",
      "10/10 [==============================] - 27s 3s/step - loss: 0.6756 - accuracy: 0.7233 - val_loss: 0.7026 - val_accuracy: 0.7083\n",
      "Epoch 71/100\n",
      "10/10 [==============================] - 27s 3s/step - loss: 0.5849 - accuracy: 0.7767 - val_loss: 0.6955 - val_accuracy: 0.6917\n",
      "Epoch 72/100\n",
      "10/10 [==============================] - 27s 3s/step - loss: 0.6724 - accuracy: 0.7133 - val_loss: 0.6844 - val_accuracy: 0.7000\n",
      "Epoch 73/100\n",
      "10/10 [==============================] - 28s 3s/step - loss: 0.6822 - accuracy: 0.7100 - val_loss: 0.6997 - val_accuracy: 0.7000\n",
      "Epoch 74/100\n",
      "10/10 [==============================] - 28s 3s/step - loss: 0.6500 - accuracy: 0.7300 - val_loss: 0.6996 - val_accuracy: 0.7083\n",
      "Epoch 75/100\n",
      "10/10 [==============================] - 29s 3s/step - loss: 0.7191 - accuracy: 0.7094 - val_loss: 0.6910 - val_accuracy: 0.7083\n",
      "Epoch 76/100\n",
      "10/10 [==============================] - 27s 3s/step - loss: 0.6261 - accuracy: 0.7333 - val_loss: 0.7054 - val_accuracy: 0.7000\n",
      "Epoch 77/100\n",
      "10/10 [==============================] - 27s 3s/step - loss: 0.6999 - accuracy: 0.7133 - val_loss: 0.6909 - val_accuracy: 0.7000\n",
      "Epoch 78/100\n",
      "10/10 [==============================] - 27s 3s/step - loss: 0.6601 - accuracy: 0.7500 - val_loss: 0.6816 - val_accuracy: 0.7083\n",
      "Epoch 79/100\n",
      "10/10 [==============================] - 27s 3s/step - loss: 0.6353 - accuracy: 0.7300 - val_loss: 0.6896 - val_accuracy: 0.7083\n",
      "Epoch 80/100\n",
      "10/10 [==============================] - 28s 3s/step - loss: 0.6977 - accuracy: 0.7033 - val_loss: 0.6974 - val_accuracy: 0.6917\n",
      "Epoch 81/100\n",
      "10/10 [==============================] - 28s 3s/step - loss: 0.7053 - accuracy: 0.6933 - val_loss: 0.6829 - val_accuracy: 0.7083\n",
      "Epoch 82/100\n",
      "10/10 [==============================] - 30s 3s/step - loss: 0.6608 - accuracy: 0.7100 - val_loss: 0.6918 - val_accuracy: 0.7083\n",
      "Epoch 83/100\n",
      "10/10 [==============================] - 31s 3s/step - loss: 0.6645 - accuracy: 0.7300 - val_loss: 0.6941 - val_accuracy: 0.6833\n",
      "Epoch 84/100\n",
      "10/10 [==============================] - 32s 3s/step - loss: 0.6532 - accuracy: 0.7400 - val_loss: 0.6870 - val_accuracy: 0.6833\n",
      "Epoch 85/100\n",
      "10/10 [==============================] - 33s 4s/step - loss: 0.6208 - accuracy: 0.7300 - val_loss: 0.6676 - val_accuracy: 0.7000\n",
      "Epoch 86/100\n",
      "10/10 [==============================] - 27s 3s/step - loss: 0.6094 - accuracy: 0.7267 - val_loss: 0.6798 - val_accuracy: 0.7083\n",
      "Epoch 87/100\n",
      "10/10 [==============================] - 27s 3s/step - loss: 0.6734 - accuracy: 0.7367 - val_loss: 0.6860 - val_accuracy: 0.7000\n",
      "Epoch 88/100\n",
      "10/10 [==============================] - 27s 3s/step - loss: 0.6216 - accuracy: 0.7567 - val_loss: 0.6797 - val_accuracy: 0.7000\n",
      "Epoch 89/100\n",
      "10/10 [==============================] - 28s 3s/step - loss: 0.6014 - accuracy: 0.7344 - val_loss: 0.6800 - val_accuracy: 0.7250\n",
      "Epoch 90/100\n",
      "10/10 [==============================] - 28s 3s/step - loss: 0.7059 - accuracy: 0.7133 - val_loss: 0.6754 - val_accuracy: 0.7167\n",
      "Epoch 91/100\n",
      "10/10 [==============================] - 27s 3s/step - loss: 0.5583 - accuracy: 0.7500 - val_loss: 0.6863 - val_accuracy: 0.7333\n",
      "Epoch 92/100\n",
      "10/10 [==============================] - 28s 3s/step - loss: 0.6027 - accuracy: 0.7400 - val_loss: 0.6855 - val_accuracy: 0.7250\n",
      "Epoch 93/100\n",
      "10/10 [==============================] - 27s 3s/step - loss: 0.7318 - accuracy: 0.7333 - val_loss: 0.6811 - val_accuracy: 0.7167\n",
      "Epoch 94/100\n",
      "10/10 [==============================] - 28s 3s/step - loss: 0.6083 - accuracy: 0.7600 - val_loss: 0.6774 - val_accuracy: 0.7250\n",
      "Epoch 95/100\n",
      "10/10 [==============================] - 27s 3s/step - loss: 0.5733 - accuracy: 0.7467 - val_loss: 0.6967 - val_accuracy: 0.7250\n",
      "Epoch 96/100\n",
      "10/10 [==============================] - 27s 3s/step - loss: 0.6556 - accuracy: 0.6867 - val_loss: 0.6911 - val_accuracy: 0.7333\n",
      "Epoch 97/100\n",
      "10/10 [==============================] - 27s 3s/step - loss: 0.6037 - accuracy: 0.7433 - val_loss: 0.6891 - val_accuracy: 0.7333\n",
      "Epoch 98/100\n",
      "10/10 [==============================] - 28s 3s/step - loss: 0.6943 - accuracy: 0.6967 - val_loss: 0.6980 - val_accuracy: 0.7083\n",
      "Epoch 99/100\n",
      "10/10 [==============================] - 28s 3s/step - loss: 0.6230 - accuracy: 0.7733 - val_loss: 0.6860 - val_accuracy: 0.7000\n",
      "Epoch 100/100\n",
      "10/10 [==============================] - 28s 3s/step - loss: 0.6085 - accuracy: 0.7367 - val_loss: 0.6855 - val_accuracy: 0.7167\n"
     ]
    }
   ],
   "source": [
    "# define model\n",
    "history = model.fit_generator(\n",
    "      train_generator,\n",
    "      steps_per_epoch=10,\n",
    "      epochs=100,\n",
    "      validation_data=validation_generator,\n",
    "      validation_steps=6)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "76b97fe7",
   "metadata": {},
   "outputs": [],
   "source": [
    "from tensorflow.keras.callbacks import EarlyStopping\n",
    "\n",
    "# Define the EarlyStopping callback\n",
    "early_stopping = EarlyStopping(\n",
    "    monitor='val_accuracy',       # Metric to monitor (e.g., 'val_loss', 'val_accuracy')\n",
    "    patience=10,              # Number of epochs with no improvement after which training stops\n",
    "    verbose=1,                # Verbosity mode: 0 = silent, 1 = messages\n",
    "    restore_best_weights=True # Restore model weights from the epoch with the best monitored value\n",
    ")\n",
    "\n",
    "# Train the model with the EarlyStopping callback\n",
    "history = model.fit(\n",
    "    train_generator,\n",
    "    steps_per_epoch=10,\n",
    "    epochs=100,\n",
    "    validation_data=validation_generator,\n",
    "    validation_steps=6,\n",
    "    callbacks=[early_stopping]  # Add the EarlyStopping callback here\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "48c5e45b",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "567311b6",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "id": "fd5ba924",
   "metadata": {},
   "outputs": [],
   "source": [
    "#save model\n",
    "model_json=model.to_json()\n",
    "with open(\"res50-swish-Adagrad_ColorAugmentation_cropped.json\", \"w\") as json_file:\n",
    "    json_file.write(model_json)\n",
    "#serializar los pesos\n",
    "model.save_weights(\"res50-swish-Adagrad_ColorAugmentation_cropped.h5\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "id": "2801554e",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\oscar\\AppData\\Local\\Temp\\ipykernel_40624\\1979981568.py:1: UserWarning: `Model.predict_generator` is deprecated and will be removed in a future version. Please use `Model.predict`, which supports generators.\n",
      "  predictions=model.predict_generator(validation_generator, steps=len(validation_generator), verbose=1)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "7/7 [==============================] - 4s 478ms/step\n"
     ]
    }
   ],
   "source": [
    "predictions=model.predict_generator(validation_generator, steps=len(validation_generator), verbose=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "id": "51d07cc9",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "val_preds = np.round(predictions)# from probabilities to 0 or 1\n",
    "val_trues = validation_generator.classes"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "id": "fe41598d",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\oscar\\AppData\\Local\\Temp\\ipykernel_40624\\1970655399.py:7: UserWarning: `Model.predict_generator` is deprecated and will be removed in a future version. Please use `Model.predict`, which supports generators.\n",
      "  Y_pred = model.predict_generator(validation_generator, num_of_test_samples // batch_size+1)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Confusion Matrix\n",
      "[[ 4  0  1  0]\n",
      " [ 0 39  8  7]\n",
      " [ 0  4 31  1]\n",
      " [ 0  0  3 34]]\n"
     ]
    }
   ],
   "source": [
    "#modify:\n",
    "from sklearn.metrics import confusion_matrix\n",
    "from sklearn.metrics import classification_report\n",
    "import numpy as np\n",
    "num_of_test_samples = 132 #number of testing samples\n",
    "batch_size=20 #batch size for the validation set\n",
    "Y_pred = model.predict_generator(validation_generator, num_of_test_samples // batch_size+1)\n",
    "y_pred = np.argmax(Y_pred, axis=1)\n",
    "print('Confusion Matrix')\n",
    "print(confusion_matrix(validation_generator.classes, y_pred))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "id": "2395fdea",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Classification Report\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "        croc       1.00      0.80      0.89         5\n",
      "       hyena       0.91      0.72      0.80        54\n",
      "     leopard       0.72      0.86      0.78        36\n",
      "        lion       0.81      0.92      0.86        37\n",
      "\n",
      "    accuracy                           0.82       132\n",
      "   macro avg       0.86      0.83      0.83       132\n",
      "weighted avg       0.83      0.82      0.82       132\n",
      "\n"
     ]
    }
   ],
   "source": [
    "print('Classification Report')\n",
    "target_names = [ \"croc\",'hyena', 'leopard', 'lion']\n",
    "print(classification_report(validation_generator.classes, y_pred, target_names=target_names))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "d3e65c4e",
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "18c1a03a",
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "1ee2112b",
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "id": "217fc548",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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dh9//HGsWbMG//nPf9C0aVPEx8dj8ODBtjqIj493Wy5PvxPhjT9m9c3JASZNAo4dk5alp/O5bkR6eDXreIveYzWqjtRu5623+CsykgsJgagPo8+ZUt0btW1/ESqzU9MoIZNz1113ITIyEkuWLMF///tfjB492tbBb9q0CQMHDsTw4cPRvn17NGnSBAcPHlS97VatWiE/Px8nTpywLfv555/t1vnpp5+QmZmJadOmoUuXLrj88sudRi7FxMTAKr9zuNhXbm4uLly4YLftiIgINGvWTHWZHdm0aRNGjRqF22+/HW3btkVqaiqOHDli+71t27aorq7G999/r/j/du3aYdOmTaisrNRdBiJ08fWsvjk5wODBzp3h8eN8eU6OunWMQO+xGlVHnrbjiOMtR9THqVPGnTNXde8Ks87yHCqzU5NgMTk1atTAkCFD8M9//hMnTpzAqFGjbL81bdoUa9euxebNm7F3717cf//9KCoqUr3tG264Ac2bN8e9996LnTt3YtOmTZg2bZrdOk2bNkV+fj6WLVuGw4cP44033sCqVavs1snKykJeXh5yc3NRXFyM8vJyp33dc889iIuLw8iRI7F7925s2LABDz30EEaMGGFzB+mhadOmyMnJQW5uLnbu3Ilhw4bZWWSysrIwcuRIjBkzBp9++iny8vKwceNGrFixAgAwceJElJaW4u6778avv/6KgwcP4qOPPsL+/ft1l4kIHXw5q6/Vyp/cFQydtmWTJnleZ/Jk585bD3qP1ag6crcdNYj6mDIFmD3b+/K4Oz9KmHmW51CZnZoESxAwduxY/P3337jhhhvQuHFj2/JnnnkGnTp1Qt++fdGrVy+kpqbitttuU73diIgIrFq1CuXl5bjyyisxbtw4vPzyy3brDBw4EI888ggmTpyIDh06YPPmzXjmmWfs1rnjjjtw0003oXfv3qhfvz6WLl3qtK+EhASsWbMGZ86cwRVXXIHBgwfj+uuvx1tvvaWtMhyYPXs2ateujW7duuGWW25B3759nfLTzJs3D4MHD8aECRPQokUL3HfffTZLT926dbF+/XqcP38ePXv2ROfOnfHee+9RTAthw1ez+m7a5P7JnTH+u6d1CgqAN980RrToPVYt/7NagY0bgaVL+XtFhfS9Th1gxQrn7ahF1Ee9et6fM0/nxxG97cGxPow4j0p40479VUZPWJhS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YnXr1mVffvkly8vLYx9//DGrUaMGmzNnjm0dqmt9fP3112zatGls5cqVDABbtWqV3e9q6nX8+PGsUaNGbO3atey3335jvXv3Zu3bt2dVVVVelY0EixuuvPJKNn78eLtlLVq0YE899VSAShR6nDx5kgGwzfhdXV3NUlNT2auvvmpbp6ysjCUnJ7N33nknUMUMas6dO8cuv/xytnbtWtazZ0+bYKG6NpYnn3ySXXPNNS5/p/o2jptvvpmNGTPGbtmgQYPY8OHDGWNU10bhKFjU1OvZs2dZdHQ0W7ZsmW2d48ePs4iICPbNN994VR5yCbmgoqIC27dvR58+feyW9+nTB5s3bw5QqUKPkpISAECdOnUAAHl5eSgqKrKr99jYWPTs2ZPqXScPPvggbr75Ztxwww12y6mujeXzzz9Hly5dcOedd6JBgwbo2LEj3nvvPdvvVN/Gcc0112DdunU4cOAAAGDnzp348ccf0b9/fwBU175CTb1u374dlZWVdus0bNgQbdq08bruQ2a2ZqMpLi6G1WpFSkqK3fKUlBQUFRUFqFShBWMMjz76KK655hq0adMGAGx1q1TvR48e9XsZg51ly5bht99+w7Zt25x+o7o2lj///BPz5s3Do48+in/+85/YunUrHn74YcTGxuLee++l+jaQJ598EiUlJWjRogUiIyNhtVrx8ssvY+jQoQCobfsKNfVaVFSEmJgY1K5d22kdb/tOEiwesFgsdt8ZY07LCH1MnDgRv//+O3788Uen36jevaegoACTJk3Ct99+i7i4OJfrUV0bQ3V1Nbp06YJXXnkFANCxY0f88ccfmDdvHu69917belTf3rN8+XIsWrQIS5YsQevWrZGbm4vJkyejYcOGGDlypG09qmvfoKdejah7cgm5oF69eoiMjHRShCdPnnRSl4R2HnroIXz++efYsGED0tPTbctTU1MBgOrdALZv346TJ0+ic+fOiIqKQlRUFL7//nu88cYbiIqKstUn1bUxpKWloVWrVnbLWrZsifz8fADUto3k8ccfx1NPPYW7774bbdu2xYgRI/DII49gxowZAKiufYWaek1NTUVFRQX+/vtvl+vohQSLC2JiYtC5c2esXbvWbvnatWvRrVu3AJUq+GGMYeLEicjJycH69euRnZ1t93t2djZSU1Pt6r2iogLff/891btGrr/+euzatQu5ubm2V5cuXXDPPfcgNzcXTZo0obo2kO7duzsN0T9w4AAyMzMBUNs2kosXLyIiwr77ioyMtA1rprr2DWrqtXPnzoiOjrZbp7CwELt37/a+7r0K2Q1xxLDmDz74gO3Zs4dNnjyZJSYmsiNHjgS6aEHLAw88wJKTk9nGjRtZYWGh7XXx4kXbOq+++ipLTk5mOTk5bNeuXWzo0KE0HNEg5KOEGKO6NpKtW7eyqKgo9vLLL7ODBw+yxYsXs4SEBLZo0SLbOlTfxjBy5EjWqFEj27DmnJwcVq9ePfbEE0/Y1qG61se5c+fYjh072I4dOxgANmvWLLZjxw5bOg819Tp+/HiWnp7OvvvuO/bbb7+x6667joY1+4O3336bZWZmspiYGNapUyfb8FtCHwAUXwsWLLCtU11dzZ577jmWmprKYmNj2bXXXst27doVuEKHEI6CheraWL744gvWpk0bFhsby1q0aMHeffddu9+pvo2htLSUTZo0iTVu3JjFxcWxJk2asGnTprHy8nLbOlTX+tiwYYPiPXrkyJGMMXX1eunSJTZx4kRWp04dFh8fzwYMGMDy8/O9LpuFMca8s9EQBEEQBEH4FophIQiCIAjC9JBgIQiCIAjC9JBgIQiCIAjC9JBgIQiCIAjC9JBgIQiCIAjC9JBgIQiCIAjC9JBgIQiCIAjC9JBgIQiCIAjC9JBgIQiCIAjC9JBgIQiCIAjC9JBgIQiCIAjC9Pw/MWZZ/oWKwAwAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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qUbI+vXrcfbsWWzcuNFiDQHgV/7vxMRE/Prrr3bL8/PzVX1/4cKFaNu2LebMmWO13N2bh7hJKu1fbZvq1KmDZs2aYf78+Xj66acxf/58VK5cGR07drSs89VXX+Hq1atYsWKFxSoBwO1AycTERFVt3r9/P/bu3YsFCxagX79+luVHjhxxa7/y/W/btg2MMatzsaCgALdu3UJSUpJH23dExYoVERISgry8PLvPzp49CwCWfcfExGDixImYOHEi/vrrL4uVpHPnzvj9998BcAvYxx9/DAD4448/sGzZMkyYMAElJSV4//33vfIbiOCALCNE0CJuCmL0L/jggw+MaI4ibdq0weXLl/Hdd99ZLRdWBVeYTCa73/fbb7/Z1WdRS82aNZGWloYlS5aAMWZZfuLECWzdulX1dp588kls27YNW7Zswddff41+/fpZuYeU/hvGGObOnetWu9u1a4cDBw5g7969VssXL15s9V7LOWFrNXJG+/btceXKFXz11VdWy0UWUvv27V1uwx1iYmLQvHlzrFixwqqdpaWlWLhwIdLT01GjRg2776WkpKB///7o2bMnDh8+jGvXrtmtU6NGDbzyyiuoX78+du3a5ZX2E8EDWUaIoKVFixaoWLEiBg8ejPHjxyM8PByLFi2yu2EZSb9+/TBjxgz07t0bkydPxu23347vvvsO33//PQC4zF556KGH8Prrr2P8+PFo06YNDh8+jEmTJiE7Oxu3bt3S3J6QkBC8/vrrGDRoEB555BE89dRT+PvvvzFhwgTVbhqAx7yMHDkSPXv2RHFxsV0a7r333ouIiAj07NkTo0ePxo0bNzBnzhxcunRJc5sBYMSIEZg3bx4efPBBTJ482ZJNI0b8glq1auG2227DmDFjwBhDQkICvv76a6xZs8Zum/Xr1wcAvPPOO+jXrx/Cw8NRs2ZNq1gPQd++fTFr1iz069cPx48fR/369bFlyxa88cYb6NSpk1Vmkd5MnToV9957L9q1a4cXXngBERERmD17Nvbv348lS5ZYBFjz5s3x0EMPoUGDBqhYsSIOHTqETz/9FHfddReio6Px22+/YejQoXj00UdRvXp1REREYP369fjtt98wZswYr7WfCA7IMkIELYmJifj2228RHR2N3r17Y8CAAShfvjyWLl1qdNMsxMTEYP369Wjbti1Gjx6Nf/zjHzh58qSlwqdt5U9bxo0bh1GjRuHjjz/Ggw8+iI8++gjvv/8+7r77brfbNHDgQHz00Uc4ePAgunXrhkmTJuHll19WDBB2RHx8PB555BGcPn0aLVu2tBud16pVC8uXL8elS5fQrVs3PPfcc2jUqJFV6q8WUlNTsWnTJtSpUwfPPPMMevfujaioKLz33ntW64WHh+Prr79GjRo18PTTT6Nnz54oKCjA2rVr7bbZtm1bjB07Fl9//TXuvvtu3HHHHdi5c6fi/qOiorBhwwY88cQT+Pe//40HHngACxYswAsvvGCJUfIWbdq0sQTQ9u/fH48//jgKCwuxcuVKqxTxe+65BytXrsSTTz6Jjh074q233kLfvn3x9ddfA+DH8LbbbsPs2bPRvXt3dOnSBV9//TWmTZuGSZMmefU3EGUfE5PbWgmCCAjeeOMNvPLKKzh58qTblWEJgiD8BXLTEISfI0bvtWrVws2bN7F+/Xq8++676N27NwkRgiDKBCRGCMLPiY6OxowZM3D8+HEUFxejatWqeOmll/DKK68Y3TSCIAhdIDcNQRAEQRCGQgGsBEEQBEEYCokRgiAIgiAMhcQIQRAEQRCGEhABrKWlpTh79ixiY2MVy3oTBEEQBOF/MMZw+fJlVK5c2WmRxoAQI2fPnkVGRobRzSAIgiAIwg1OnTrltBRBQIgRUV751KlTiIuLM7g1BEEQBEGooaioCBkZGYrTJMgJCDEiXDNxcXEkRgiCIAgiwHAVYkEBrARBEARBGAqJEYIgCIIgDIXECEEQBEEQhkJihCAIgiAIQyExQhAEQRCEoZAYIQiCIAjCUEiMEARBEARhKCRGCIIgCIIwFLfEyOzZs5GdnY2oqCjk5ORg8+bNTtdftGgRGjZsiOjoaKSlpeHJJ5/EhQsX3GowQRAEQRBlC81iZOnSpRgxYgTGjRuH3bt3o1WrVnjggQdw8uRJxfW3bNmCvn37YuDAgThw4AA+//xzbN++HYMGDfK48QRBEARBBD6axcj06dMxcOBADBo0CLVr18bMmTORkZGBOXPmKK7/yy+/ICsrC8OGDUN2djbuvvtuPP3009ixY4fHjScIgiAIIvDRJEZKSkqwc+dOdOzY0Wp5x44dsXXrVsXvtGjRAqdPn8aqVavAGMNff/2FL774Ag8++KDD/RQXF6OoqMjqQRAEQRBE2USTGDl//jzMZjNSUlKslqekpCA/P1/xOy1atMCiRYvQo0cPREREIDU1FRUqVMB//vMfh/uZOnUq4uPjLY+MjAwtzSQChAMHgF27jG4FQZQtNm4EFi82uhUEoQ23AlhtZ99jjDmcke/gwYMYNmwYXnvtNezcuROrV69Gbm4uBg8e7HD7Y8eORWFhoeVx6tQpd5pJ+DGlpUCbNsDddwNXrhjdGoIoG1y8CHTqBDzxBHD0qNGtIQj1hGlZOSkpCaGhoXZWkIKCAjtriWDq1Klo2bIlXnzxRQBAgwYNEBMTg1atWmHy5MlIS0uz+05kZCQiIyO1NI0IMK5cAURCVUEBUL68se0hiLLAvHnA9ev89Z9/ArfdZmx7CEItmiwjERERyMnJwZo1a6yWr1mzBi1atFD8zrVr1xASYr2b0NBQANyiQgQnhYXKrwmCcA+zGZDnERw/blhTCEIzmt00I0eOxEcffYR58+bh0KFDeP7553Hy5EmL22Xs2LHo27evZf3OnTtjxYoVmDNnDo4dO4affvoJw4YNQ7NmzVC5cmX9fgkRUMhjkv/+27BmEESZYfVq4Ngx6X1urnFtIQitaHLTAECPHj1w4cIFTJo0CXl5eahXrx5WrVqFzMxMAEBeXp5VzZH+/fvj8uXLeO+99zBq1ChUqFAB99xzD9588039fgURcJBlhCD0ZdYs/lyxInDpEllGiMDCxALAV1JUVIT4+HgUFhYiLi7O6OYQOrB6NfDAA/z1/PlA//6GNocgApojR4AaNQDGgLfeAkaPBpo1A7ZtM7plRLCj9v5Nc9MQhkCWEYLQjzlzuBB54AGgQwe+jCwjRCBBYiSIOXkS+OUXY/ZNMSMEoQ/XrvEsGgB49lkgK4u/LijgnxFEIEBiJIjp3Blo0cKYQDeyjBCEPixezAV9djZw//1AhQqAsIafOGFkywhCPSRGgpSbN4H9+7lp98gR3+9fLkDIMkIQ7sGYFLg6ZAgQGgqYTJJ1hFw1RKBAYiRIOXWKV0EFuDnX18jdNGQZIQj3+PlnYM8eICoKGDBAWk5ihAg0SIwEKfJOyggxQpYRgvCc1av5c7duQEKCtJzECBFokBgJUuRxIufO+X7/ZBkhCM8RM3PUqGG9nMQIEWiQGAlS5GLEaMsIiRGCcI+//uLPtlODkRghAg0SI0GK0WKEUnsJQoIxYNgw4P33tX1PWEZSU62XkxghAg0SI0GK0W4aW8uI/9cBJgjvcegQ8J//AC+8oO1acGUZoVojRKBAYiRIMdoyIhcjN29K054TRDAiRMXVq+rdlow5FiMVKwLx8fw11RohAgESI0HI9euSeRcw3k0DUNwIEdycPy+9PnNG3XcuXwZu3OCvbcUIQK4aIrAgMRKEiM4pPJw/X7niW8tESYnUiYaG8meKGyGCGXfEiLCKlC8PxMTYf05ihAgkSIwEIcJFU6sWEBHBX/sybkRuFalShT+TZYQIZtwRI8K6qWQVAUiMEIEFiZEgRIiR7GygUiX+2pdiRAiPmBipUBNZRohgxhPLCIkRoixAYiQIkYuR5GT+2pdxI8IyEh/PJ/UCyDJCBDfywcDZs+q+Q2KEKEuQGAlCjBYjQnjExUkR/2QZIYIZTywjtjVGBCRGiECCxEgQIjono9008fGSGCHLCBHMeDNmhGqNEIEAiZEgxGjLiHDTxMVJbhqyjBDBjDdiRipUoFojROBAYiTIKCwELl3ir+WWESPcNGQZIQiOXIz89RcvBOgKV2IEIFcNETiQGAkyhFUkKYnXJxCWESNSe+UBrGQZIYKVq1elOj8mE6+sKi9K6AhXMSMAiREicCAxEmTIXTSA/wSwkmWECFaEVSQyEkhP569dZdTIBQtZRoiyAImRIMNWjBjhpqHUXsLXfPYZsHmz0a1QRoiRpCSpCKCruBFXpeAFJEaIQCHM6AYQvsWRZeTcOT7aMpm83wZK7SV8yenTQM+e3J2Rl2d0a+xxR4wIF01MjHIpeAGJESJQIMtIkOFIjFy/zn3XvkAewEqWEcLbCHdGfj5gNhvbFiXkYqRyZf5arRhxFi8CSGJEPks3ERiUlPBHsEBiJMiwFSMxMUC5cvy1r4JY5am9ZBkhvI1c6Pqj6BVipFIl7ZYRZy4aQBIj5875brBBeMa5c8C4cfx8aNqUW6yDARIjQQRj1gXPBL4OYlWyjFy+7J+jViLwkU/MKNLa/QkxCNDiplETvApoqzUSLDc9PTlyBPjmG322lZcHjBrFBeQbb/Dzdt8+3jcGAyRGgghRidFkAqpWlZb7WowoWUbkywlCT+TWEH+0wCnFjLjKplFrGQHUxY3k5QFpafxmSKine3egc2dgzx7PtvPtt3yAOH0676NzcoDQUP6ZP1rzvAGJkSBCuGgqV+ZphAJfl4SXW0YiIoCoKOvlBKEn8vPKHy0jngSwuooZAdSJkR9/5NtcudL19gjOxYvA3r389e+/e7atqVOB4mKgWTPgu++A7duBihX5Z8HSL5IYCSJs40UEvrSMMGad2gtQ4TPCu/i7m0ZJjFy54txSqLdlRLhwfFn8MND55Rfp9enT7m/n0iXg55/562XLgPvv59brYKvBRGIkiFCKFwF8W2vk6lWgtJS/jovjz8F20RG+JZDcNDEx0vXgzDqiNmYEUJdRI8RIYSEfoROuEQIC8EyMrFvH+8TatYHMTGl5sPWLJEaCCFeWEV+MisSFFRoKREfz12QZIbyJv7tpxHUnBgVq0nu1WEbE9e7MMnLypPRaPk8O4Ri5GDl1yv3trF7Nn++/33o5iRGizOIPbhp58KoosBZsFx3hW/zZTVNaCly4wF8nJfFnV3EjjGmLGRHXuxrLCECuGjWYzcC2bdJ7dy0jjJEYEZAYCSIciRFfumnkwasCsowQ3sSf3TSFhVJKe2Iif3aVUXPlijSxnhbLyIULjuNQ/EGMBJJ76OBB/j8I3BUjBw5w0VmuHNC6tfVnJEaIMonZLJlijXTTyC0jgmC76Ajf4s+WEeESiY2VMtxcWUbUloIXxMZKQkfJOvL339bHyAgxsn077wcmT/b9vt1BuGjq1uXPeXnAzZvatyOsIm3bSlmFgmDrF0mMBAlnzvCLJTxc6uwEcjeNtwsfkWWE8DX+HDMiD14VuBIjWoJXBdWq8WclMWJbDM0IMbJ1K7eMrF/v+327gxAjXbrwPpUx9+Y9cuSiAYKvOjWJkSBBdEJVq0rFdATCTXPzpvdVuG1ar/x1sIwACN/iz2JEXn1VoNYyoiZeRCCsoceO2X8mD14FfDuDt+DiReP27Q5CjLRoAaSn89daXTVXrkgzSTsTI8HSL5IYCRIcxYsA3DwYG8tfe3tUJJ+xV0CWEcKbyF0Q/naOyeelEbjKptGSSSNwFsSqxTLy1VfAjh3q96sWEcQbCMGzFy8Chw/z182buy9GNm7kE+FlZwPVq9t/HmyTiJIY8TM2buTzHejNmjX8uX595c99FcSq5KYJthEA4TvMZuu5PfzNMuLMTZOfD9y6Zf8dd8SIGjeNSLV3JAhyc4FHHgEeflh/d66wjFy4INUhMppVq4C5c+1/qyh2Vr06/9/cFSNyF43ILJQTbP0iiRE/Yv9+4J57gH/8Q9/tXr3KRzQA0KOH8jq+CmJVCmANthEA4TtsJxm7dMm/JoRTEiMpKdyVWlqqPDhwJ2bEmZtGiJEmTfizoz7g6FH+nJcntUEvhGXEbPYPwcgY0KsX8M9/2k+EJ8TIXXfxZyFGtNYacRYvApAYIQxk61Z+Efz2m3XamKesXMknX6pWjc99oISvao04s4z4mwmdCHyE+BUjT7OZi3N/QUmMhIZK8SBKrhpPYkaOH7cXY0KMNG3Knx2JEXmq8f796vetBmEZAfwjbuTiRamvGjfO2loj4kVsxYgWy8iRI1zchYcD7dopr0NihDAMMekSwPPYlWCMp7/NmaN+u4sW8edevZTNgYDv3DSU2kv4EnFOJSUBYWH8tT+MvAVKAayA8yBWd9w0VasCISG8Pon4vkAEsBopRoRlxNn+fYlcWOzbByxdyl/Li50JMZKRYf8dVwiryN13S/F6tgRbv0hixI+QixFHF/vhw8CrrwLPPms9mnDE+fPA99/z1716OV7PV24aSu0lfIn8fBOzoPqTGFGyjAD6i5GICGkEL48buXFDcrnk5PDnS5eUa2YEkxixPe6vvcaPycGD3PUXEwPUq8c/c8cy4spFA0h9ZFGR/8TReBO3xMjs2bORnZ2NqKgo5OTkYLPIT1Kgf//+MJlMdo+6oloMAYCfbL/9Jr3ft095vV27+DNjUlqYM774ggfBNW7MJ2JyhK/cNM4sIyUlvHPUgytXguMCJpwjTyUXYsSfRK8jMeIoo4Yx92JGAOW4ERHnEB3NAzJDQqzbJUfeFj3FyM2bxhdds0UIi7ZtudX4yBFgwQLJRdOsmVQiQYiRs2eVA45tuXED2LCBv1YjRhjT123vr2gWI0uXLsWIESMwbtw47N69G61atcIDDzyAk7bJ6v/jnXfeQV5enuVx6tQpJCQk4NFHH/W48WWJ48etg+0cXexCjAA888YVcheNM4zMpomNldxHetwo8vK4P51OMSJQLCPy1F7AsWVEayl4OUrpvSJeJDOT31xFpVYlQSC3jBw4oJ/Yt/0//EmM1KrFY0YAYOJESUQIFw3AB3JhYfx4qAnsnTaNx/ClpzvObgR4yYXwcP7anwS0t9AsRqZPn46BAwdi0KBBqF27NmbOnImMjAzMcRDEEB8fj9TUVMtjx44duHTpEp588kmPG1+WEC4aURLYkRjZvVt6LS4MR5w4AWzZwm/0jz/ufF0j3TQhIZKlRA//6K5dPEjxxx893xYR2MgtccId6C9i5OZN6SbjyE1jOz+NvBR8+fLa9qeU3isXI4AkilyJkatX7euTOGLPHh6P4mjwZOtu9ocAViEC09OBp5/mcSFnzgCffcaXy8VIaKj0f7ly1fz+OzBpEn/9r385juED+GfBFDeiSYyUlJRg586d6Nixo9Xyjh07YuvWraq28fHHH6NDhw7IFGe/AsXFxSgqKrJ6lHWEGHnoIf6cn29vKmXMWoz89pvzuBFx4bRpI5kSHWGkmwbQN25ElGU+f567fojgRcky4i+jTHHtmkxS2wSOLCPuxIsIlNw0wqDtSoyUlkrXlbCeqHXVTJsG7NzJ3RxKyONFlPZtBEJUVKnCB4jjx1t/fued1u/VxI2UlvJU4ZIS7p5xZa0GgqvsgSYxcv78eZjNZqTYXAkpKSnIV2GfysvLw3fffYdBgwY5XW/q1KmIj4+3PDJEuHIZRoiRli2lTuPAAet1Tp7ko7qwMOC227g4cTb6V+uiAaRO6Px578Va3LzJzZOAtWVE/l6Pi04+R4Rt5gARXMgr/vqbm0bcdBMS7Kdo8KYYUbKMVK3Knx2JkQsXpKDW9u35s6O4NjmMAWvX8teOBjq2Ayp/EiNCZPTrB9SowV+LYmdy1NQamTuXx/nFxADvv+/cKiIgy4gLTDZHkTFmt0yJBQsWoEKFCujatavT9caOHYvCwkLL45TWajIBiBAjDRtKUdq2F7uwitSrBwjjlCPT5759/BEeDnTv7nr/4uLyZtEheUyMNy0jcl3szuRVRNlBHsDqb24aR8GrgCRGioqsgxfFua2lxohAuGlOnZKEhSM3ja1wEC6a5GSpOJoay8iBA1KbHQ0MhGUkIoI/+6MYCQsD3n6bi0alopSuLCNnzgCjR/PXU6ZIx9sVJEYckJSUhNDQUDsrSEFBgZ21xBbGGObNm4c+ffogQpx1DoiMjERcXJzVoyxTVCSNVuRixPZiF8GrjRvzKG/AsRhZsoQ/d+pkbwJWIiJC6qy95aoRF1S5clJglsBblhESI8GNP7tpnImR2FgpJkRuHfHEMpKayl0OpaWSe8ZWjDiKHRNipHJlx/2TEsIqAri2jIj5WYwWI5cvSyJWPsN55868bVOm2H/HmRhhDBgyhG+zeXNg6FD1bSEx4oCIiAjk5ORgjZjo5H+sWbMGLVq0cPrdTZs24ciRIxg4cKD2VpYBLl7kiloUz5EjUnrT07nJ1tHFLiwjcjGiFDdiNgOLF/PXalw0Am8HsTqKFwG8EzNi+9od/v47ODqCsoo/u2kcZdIIlFw1nogRkwnIyuKvc3N5PyFunq5iRkQb5GLk99+V65HIkd8qCgqUS/ELy0itWtK+jUzLF781Ls6+IFnFilL6sxxnhc+WL+dVsMPCgI8+snfJOYPEiBNGjhyJjz76CPPmzcOhQ4fw/PPP4+TJkxg8eDAA7mLp27ev3fc+/vhjNG/eHPXEmRxkzJ0LrFgBjBjBOwE5chcNIKV77d9vffHKxUhyMlCnjnLcyOef8xFPQgJX82rxdhCrUiaNQM+LTi83zaVL/L+oXRsoLva8XYTvCVQ3DaCcUeOJGAGsM2ry87mYCA2V6po4EiNyy0jVqtxqc/Mm8OefjvdVUgJs2mT9Xun6FmJExGSYzcZar2xdNGpwFjPy9tv8+aWXJCGnFhIjTujRowdmzpyJSZMmoVGjRvjxxx+xatUqS3ZMXl6eXc2RwsJCLF++PGitIgAvPgbwDkB+gQL2YqRmTa6iCwsllX7uHH9tMknrCeuIPMW3tBR44w3+evhw7hJRi7drjchHqbboZRlhzFqAeDKh1+uv847JGxODEb7Bn900jkrBC8Ro+403eIo+4FnMCGAdxCpcNOnp0mhdjRgxmdS5an75hacAV6okWRiU4kaEZTctTeobjHTViD5X7qJxhbzwmXyw+fffwPbt/PXTT2tvi1YxcvIkz/RZvlz7vozGrQDWIUOG4Pjx4yguLsbOnTvRunVry2cLFizARptAhvj4eFy7dg1PPfWUR40NVI4fB3bskN6LlFuBrRiJiJBGCSKIVVhFqleXLmyluJFvvuHfiY0FnntOWzt95abxpmXk77+trRjuWkb+/BN47z3pvb+MpgltBIKbxpEYGT6cf3boENCqFTBggBTr4a5lRJ7eaxsvArgWI+IGrUaMiHiR9u0l8aQkRoRlJDHReZ0TX+GOZSQ1lQs6s9n6N27axAeI1atL4lILWicR/eILPnfOK69o35fR0Nw0PmDFCv4sOp0vvpDqX5jNkuBo0ED6ju3FLg9eFbRpw59/+41f0IxJwVVDhqgLXJVTFtw0thYMd8XIiy9a+8P95QZGaCOQ3TSNG/O4DFEJYf58SRTo4aZxJkYuXLAubS63jADqxIiIF7n3Xud9i7CMJCb6rviiM9wRI3JXlzxuZN06/izSobWitc6I6O9+/50/AgkSIz5AuGhefZUr6EuXpAv1yBFe3rlcOSmaHLC/2OXxIgIRNwLwuJF164Bff+XbGjlSezu97abxRQCruBhFprk7YmTDBuC//7WurOgvNzB/ZO1a62kK/AXGlC0j16/7RwyQKzEC8Bv03LnATz9Jg5WwMH3cNLYFz8T+xLUjL0amVYwUFvK+CAA6dJDEkzPLSEKC76alcIY7bhpAOW5k/Xr+7K4Y0TpIkw/GvvrKvX0aBYkRL3P6NJ9cyWTi9T4ee4wvF6m3wkVTr551lLU8iBWQxIjI8RfIXTXCKvLUU9IIQwtlwTIixIcQdn/9pS0y32wGnn+evx48WHKd+bMYYcw+KNpXnDzJq0l26OAfN3g5xcWSdSs+nj/0nAPJU1xl08hp0YJXMf34Y17MMCbGvX0KMXLunFRUURQ8A7jQSUiQ1gG4hUSICFsxIgZTtmzYwK+7GjX49oUYcWUZCVQ3jXx98f38fH6MTSagXTv32qK1X5QPvkiMEFYIF02LFvxC7tmTv//vf3k1Utt4EYG42A8e5B2niFqXW0YA6ST/9FMuSMLDuYvBHcRoy1u1OXxhGREjg0aNeCdw65byDKSOWLCA/ycVKgATJvhfnIEtjPFzq2FDqbqtL9m7VyqU529zAYkO3GTi2R/yOZD84f90FcBqS1gYjxsRAxp3kAfy/vILf7YtwGUrCISgDw2VPktO5u1mjMe02CLiRTp0kNYX25JTXMyDXAFry0hZECPCKtKokVRCXyueWEa2bbOv4OvPkBjxMiKqWVRBbd6c5/pfuQJ8+61jMZKdzd0tN25IgiY93b7jErHDonPt10/7RSQQox5PxQhjPIDq3Xetl/vSMpKRIR0rtb/n8mVphs7XXuPf93cxcu4cv6kcOAB88onv9y+/EX37re/37wxxLsXGSrUh/CWj5to1yaKgVozohYgbEXFrrsSIcNGIIE3AOqNGqSy8PF4EcOymES6a0FDeBxgtRoqLpX2766axFSP33ON+e9y1jIhzauVK9/fta0iMaOTWLaBPH17AzJX5Pz+fz0UAAN268Wf5DLqffeZYjISGSvEg4iZjaxUB+Iijbl3+OiSE57K7S1oaf75yxbp0u1YOHuQuoxEjrDsfNam9RUWeFTwSF2NamvR71IiRbdv4KO6vv7iL59ln+XJ/FyPykc+MGb4vFnXwoPT6m2+Ui1oZhVL2lr/8n8JaFx5uX1jL2whXjUDupgEcixHbm7OtK1lw8iTwxx+8PxJuZEcuYOGiqViR943OXMWMAcuWAUePKv4sXRC/NTJSuzVDZMuImBFPg1cB6dy9fNn1tV1cLB3PAQP4cyC5akiMaOT114GFC7m1wtVF8eWX/AJq1sz6ghdi5JtvJBUtz6QRiJGHqEuiJEYAyRT6+OPA7ber+x1KlC8vlaD2xDqyZw9/Zgz47jtpuZrUXsY8E0Ki3amp6txOp09zcXnnnTzgLiYG+OADaZ4Mf7l5OUIeuf/HH763TsgtI0eP8jb4C0qWOH/JqJEHr6qZME1P5GIkOdm+FpFtEKlt8KrAURCrcNE0ayYdb1eWEXHjd2YZ2bwZ6NGDZxHK5+txh3//G3jnHfvlcheN1v9Fbhk5doyXdAgL42nZ7qKlXxTHNjxcEiPr1xtvBVQLiREN/PgjMHmy9N6VP87WRSNo0ICXPhZm0qws5Ru0GHkIbINXBa+9BsycCcye7bw9atBiTXCEECMAF1wCZ26aqCg+GgE8u3iEz1RuGXFUsOw//+EF5hYu5B3Pk0/y2Bx5sJm/ixHbc3D6dN/tWx4vIMS2FjGkNbhYK0qWOH9x06jJpPEWwk0D2FtFAPv0WnfFiHDRAI4DWMVIXgTNOhMjImPrzBmpsKM7nDzJJ60bMcK+n3M3kwaQxMiZM5Kb6s47pQGeO0RFSQMjV+esvCBezZrcsn7rFrBqlfv79yUkRlRy8SLwxBPWnaczMXLunFSMzHaWR5NJCmQF7F00AtvSwY4sIwkJvECS0k1eK3rEjQjXEwD88IMkupwFsAL6xI2oddOcOMGP2bVrQMuWvErivHnSdwSik/R3MdK5Mx+FbdzouzTbs2f5aC00VJr8Sy4+nfH557zT9KZ48mc3jbjZqsmk0Ru5ZURp9lhHbhpbMSLcw6dP8xvl9evcpSysocJiC0gC5/Jl6+wbR5aR8+ftXX7yuhnTpvFMHncQmYkAz3SU427wKsD7jpAQLgBEYUtPXDQCtf2ivO8DgK5d+XOguGpIjKiAMV546PRpHk/wyCN8uaPpogGeLWM2cwEhH4kIhKsGUCdGEhLcq+CnFT0sI0KMhITwzkfEzTizjACeZ9Rcvy59NzXV+W8R8/7Urcvbl5OjvE1/uXk5QpyDd94pZVnMmOGbfQuryG23SdfE5s3qxOQHH/BnbwbYBYqbxtfoJUbi46U+6amn+A28Xz9+DVavzs9JQVycZPmUu2ocWUZu3rQ/jw4f5s+xsXyAM2KEs1/pGLnlVk8xEhYm9TliIOpJ8KpAbeEz26kChBj57jueCOHvkBhRwQcf8PiP8HCueGvW5MudWUYcuWgENWrwzBoAuOsu5XUqV5ZOxMaNfeNbFheTfHIuLeTnc1NsSAjw6KN8mQhs9LZlRHRykZH8uDkTI2KUVbeu8+Pq72JEblYW9VE++8w3KX1CjNSuzWOVatbko0KbSb3tuHBB6qx37/aeq8aZm8bo/9NIMZKZKZ3zasSIfMZeW8SA6YsvuLDIzOTB6z/9JLkXAMfBqbaWkagoKaDX1qUjrtnZs3lf/O237sVIyS0jW7daf+aJmwawFjHR0daCzF3ctYzk5PDfceWKFEzrz5AYccHevVIn/+abPG5DaWpvW0T1wQcecLzO55/zQNj77lP+XJ4+5yheRG88tYwIq0iNGtJI/euvudVClJd2ZBnROg+DLfKL0WRSJ0bEtOWOkN+8/ClTRCBGclWqAE2b8lTvW7es59XxFnIxAgAPPsifXblqvv5aKtJ25YrzmV89wZmbJphjRiIjpT5MKWZErWUEAHr14kHfDz7I//ejR4GXX1Z2PykFsdqKEaX9A/z/EiP/hx+WrCIjRmgvtie3jOzcaf19Tywjtt9r1cpakLmLVjEiLCMhIZJ15MsvPW+HtyEx4oS9e7nf88YNLiqGD+fLXYmRK1ck8+NttznefkYGN287G5n37cs7LLlbx5t4GjMiLvSGDXkAW3g476DEzJUmk+PqkVrnYbDF9mKUixFH/me1YsRs9jyC3xuIc1B0gmIagPff9357HYmR775zbu0QdXME3opx8WfLiNaCZ3rzzDN85CxSb+XI4zauXZMEg5K1oHdvfp598w3//+VVpG1RCmK1ddPI9y8XI8JFI2b2FVNrHDmizS158aI0J09cHBcickuJnmJEj3gRQL0YkQfvC4QYWbnSuCrNaiEx4oAdO3hWxfnz/KJduFAqnCQuSkcxI+Jkr1DBsUtCLU89xS/KQLOMNGzIza2is1u8mD/HxUnH0RZPLSO2F6N4vn5dGiULROfmSoyUKyeNboy+gdly+bL0u8Q5+dBD3GXy99/eL4JmK0buvpv/vwUF1rNUy7lyhQc1A1LKo7fEiJJlxF9iRkQp9qwsY/b/8sv8PxLHQ44QSIxJ7YyM1D7xpi1KVVjVWkZsr9fYWOCtt/jryZPVu5VF/5SVJU00KuJGzGap39PDTaNHvAjgvpsG4L+xQgV+LP1x/ig5JEYU2LqVq9pLl3g8x7p11spdnHD5+cpqU2k2zEDB05gR2yJuDz3Enz//nD87E2d6WUbEb4iOlvYnF1cXLkgdXY0azrdpMvnPaNoWYRWJi5P87KGh0iyvGzZ4b9+XLkk3FXGDiIgAOnbkrx25ar77jo9Gb7+dW/0A71tG/M1Nc+GCZJlzFC9mJOHh0nES13Plyp7HrCm5aZQsI0oz9ypZMnv35oO0q1et6xk5Q1huGzfm0ygAUtzIX3/x/jw01P2JCEVAb8WKvAy8Hmi1jMjbHh4uZWH6+yy+JEZs2LSJd6hFRVxVfv+9fYxDSgo/Yc1m5Vkoy4IYKSxUngDLGdevSyMYcSEK0724kTtLP9YrZkR+MSrVGhFtzMhQN+GYv4sR21GcqNybm+u9fQurSEaGdQVR8X87CiwULppu3aQMpl27vBOP469uGnHzq1nTODeNK4R1Qi5GPEVNAKt83/L1xI1UJA8AXBw1a8ZfixmIXSFcMo0aSUJw61Z+/glLd1qac3eTM+69F7jjDmDsWPe3YYsaMcKYspsGkAphupsK7StIjMi4epX72K5e5SfVqlXKpZrlylkpbiSQxUh8vFSRUaur5sABLtCSkqQL4rbbrEczzsSIOKbOUqadoWSmVHI7qY0XEfjDDUwJR2JEpG4eO+a9fdu6aAQPPMBvErt22VvXbtyQLCaPPMIzmSIiuPg8flz/Njpz0xQWGudD37KFP999tzH7V4M3xIitZYQx7TEjttesCMAVfa4r5JaRO+7gffnZs7yEu6eZNAD/Hb/+6v5kpUqoGaRdvCjNUC2Os4DESABy5Aj/wxMSeMBPdLTjdZ0FsQqVHohixFUWijPkLhq5SVe4agDnbhrhMnG3pLjSyECpJHxZESOOgu1EHMKlS55PPOgIR2IkJYV38gCfSVrOunU8ZqRyZT6ijYiQqgx7w1XjzE0D2McR+YqffuLPLVsas381eNMyIsTItWtSJouzmJFbt6SMK0diRI1l5MYN6bxt1Ij378KCu3Wr58Gr3kKNZUT0b4mJ9hk8JEYCEDHBUXY2z3d3hrMg1kC2jADux404mvRPLkacWUaECfb4ce3peoBzN00giJGNG3llXiXXnxKORnLly0sdv7dcNWKCPFsxAkixIOPGWceOiPTCRx6RgphFYLY3xYhcAEdESIMMI8TljRtSZlkgiBHbAGlPsM2mES6a8HBrd6mtGMnN5aP+cuXsCz9qESMHDnBhk5AgCQ4RN/Lzz/4rRtTE0inFiwiqV+fP3kqh1wsSIzLECa2m0ql8HgJbhBhRyuEPBNxN73UkRlq0kC4oZ5aRlBT+eWmpdhUvj98JVDfNG2/wgmXLlqlbX15jxBZvu2ocWUYAYMgQXonTbOa1Zn75hd8E/vtf/rmYwRrwnhiRp2LbCmAjM2p27uTVQytVkm4S/ohtnRA93TQXLvDzQbhoEhOtLam2Aazieq1Rwz4TT/Sxp065Lp4nd9GI/cnjRpxdT0aixTJiGy8CSBXAL12Sjrk/QmJEhrCMqBERjtw0JSWSRSHQLSNaxAhjkhixjSIPDwfuv5+/djYtt8kkWUeEj1gt58/zzkhe6RGw/y0lJdINWh4M5wxfiRFhbVDr/7atMSJHiBFvWEauXZPaqCRGTCZg7lweP3L9OreMffwx/48SEnhhNoEQIzt36hvEKp/h1FYAG5lRI3fR+Hq2Xi3IryFAHzGSmMjFBGP8XFAKXgWsA1gZc56GX7ky32ZJiX3FVlvkwasCYRnZs0eyHPibZUSNGHFmGYmJkf4/f3bVkBiRocUy4kiMnD7NL6CoKPsLOlBwx01z4gS/WMLDlTuNqVN5zZSnn3a+HXfFiBAblSrxOSIEtmLk6FE+ai5fXn0H6wsxUlQknUtCFLvCWcCdGA15Q4wcPszP8cRExxO9hYfzdO477uA3ncGD+fKHH7b+f+rX50GE587pW8JeuBciI6U5UQTe/j9nzuQ1JpRmng2EeBHAO5aR0FApe+ivv5SDV+X7vnmT/4/OLJnh4VLbXLlq5JYRQdWqvI+4dUtynwWiGHFmGQECI26ExIgMdywjtjEjcheNP498nOGOZURYRerUUS6BnJUFfPiha2uRCGJ1V4zYXoy2v0Xesan9f3whRuQ1ANSIkZs3JbeUM8uIN9w0zlw0cmJieIqv3B0hd9EAPA5ApCLr6apxNimjt900b7/Na7y8+671csYkMeLPmTSAd8QIYB3E6sgyUq6cFENy7pxyWq8cNXEjpaXKlluTSbKOCPzVTXP5suMMMGeWESAw4kZIjMhwN2ZEbl4O9OBVwL2YEUfxIlpx1zLiKMdevP/7bx48qDVeBPCNGBE3eECdGBEl7sPDlWtVuOOmOXQIWLDAtbtErRgB+E1t9Wp+vWRmWk8rL/BG3IhS8KrAm24auYXrgw+sZ0s9fJjfgKOifFdR2V3kYqR8eeUSB+4gD2J1ZBkBrONGXFVLViNGjh7lMURRUfaixlaM6CW89EIuqOXuRzlkGSlDmM1SJ6LFMnL1qnWKYFkQI84sI9evA50787kh5DctvcWI1vReRxdjhQqSmT4/33/FiNwycvasNKmgI+QzqSqV1xdi5PhxdbPiXrzIS/c/+SSwdq3zdYUYERYNV1Srxv/Pw4elGjZy5MXP9EKpxojAk/9zxw4+0Z8j5CL63Dlg6VLpvbCK3HGHPhOoeRO5GNHTUiCvNeLIMiLf/6FD0qSCjqolqxEjwkVTv761mxCwroJbqZLrTEpfI3c1OnLVKGUSyiExEkDk5/MbQFiYulLA0dGSuVfu6w7kGiMCcUO/cME+xXbtWp6uOXkyMGqUJEjExe5pCWRhTrx4UeqE1ODoYrStm+KvYkRuGSktdR2v4yoNMSOD++hv3LCuPuuIUaOkAEAx47SrtqqxjAjKlbOP3RB40zKip5vmzBlelfnhhx136vL/EQDeeUe6RkSxM3+PFwGsrW16WgrkVViFGFGyjAgxIo5Z1aqOqyWrESNKwauCJk0kcehvLhqBq8JnjizDAtGvkhgJAIRpvEoV9WV8lYJYAz2tF+Cdg7g4bW9k8hkuZ8wAxo/no1ARm+CpZSQ6Wjp2Wlw1zi5GJTGiNpMGsBYj3ihbDtjfxFy5alxViwwPl9yNrlw1a9Zw94xAPsW6LfICVFrEiDNEkbwzZ9TXWHGFN9w0Y8fyTCLA8USA4vx67DE+wt69W7KIBEq8CMCFo7gB6ilG5JYReWqvLUKMbN7Mn51dr1osI/LgVUFkpGSd87fgVYGzWiPXr0vLHYkRMXv8+fPGzsvkDBIj/0NLvIhAKYi1LLhpnFVhFaPXO+/kz6+/Lk3MVqWK89RdtbgTN+LMZyqW7d7NhVNIiGS2VIO4ed26xd1yelNSwn3agNRpuBIjamoiqIkbuXoV+Oc/+WvRIQuXmxJHj/Lg2ZgYbdeKM8qXl/5zudj1BL3dNL/+al1R9rfflNcTorJlSz6RG8ADWQsKJBHnj5PjKSEEgTcsI3I3jTPLiBjJO7NkahEjjiy3QiCKa8bfcJZRIwZiUVGO6ziVLy9Zjf3VOkJi5H+IE1mLRcO28Flpadlw0wCuxcibbwL/+hd/LWbk9dQqIvBEjCi52MQyMYutmgq7cqKjuaUB8I6r5s8/ecxSbCzQvDlf5ipN0VmNEYEaMfLaazyupGpV6X88csRxoJy42WrJRlKDkqtm/36eCi5Gx1rQ003DGDBiBH8tbpyOxIjcDfjcc/z1ihVS7EidOso3X3/EG2JEKYBVaQBjWxZBjRg5d055cs+//uL9g8kkTT9gywsv8Di4F15w3n6jcCZG5AMxZ9ekv8eNkBj5H2Ik6o5lRNwY/vqLj3JDQvzX96gWpVoj589Lx6lRI+Cll/gFLNBLjGhN72VMnWVExEJoiRcB+AXuzbgReQyGvKKkM9RM6iVqjThK792+ndfEAHjmR3Y2v/EwBuzb57qteiIvflZUxGNYGjXi6eAvvaR9e3q6aT77jJcLj44G5szhy5TEyM2bUkdfuzbQoAEPCjabgZdf5ssDwUUjuPNOfu4LK6geqEntBexTi525aSpUkLJ9lK4bYRWpUYNbCBy1a9Ik/3Wvq7GMuIp19Pe4ERIj/8Mdy4itGBEumipVpJF0oKJkGREm9Ntvlzr5iROBV17hI57u3fXZt1bLyOXL0ohI6YIUv0XMaqlVjAC+EyNCDKt107hrGSkpAQYO5Na83r2lCrnCjO3IVeNsThpPEGJk40b+/0yfLtVU2LVL+u9sKS3lBfU2bbJerpeb5to1SQyNHQvcdx9/feqU/fePHuWuvJgY6X8ZPpw/i9L0gRC8Kpg2jVsb9BQjalN7bcWIs2vWZHI+e69ewfVGotYy4gxhGfHXWiMkRv6HHpaRshAvIlCqNSLEiLxGgsnE40by8/WrnSDEiOjcXSHaGBurHHFve5HqLUY2b+Zuqx071KXR2iJM+2rFCGOSxcrdmJEvvuDWj6QkHogsEB22oyBWEYSpFAjoCWJ7Fy/y//P224FVq/iot7jYsaXm22+51aFPH+vgYmeWEbmbxlVA8ttv8/+ialVurYmPl65v2zYpubA6d7buDwJJjJhM+sSAyRGWkZs3JbHpSoyoqZbsLG5k507+rPc560v0sIyQmyZA8CRmRIxSy0q8CKBsGRH+fG8XbMrI4KmgN2/yeAZXuBoZ2C7XkkkjcCZGevUCxozh9SMyMnjp81Wr1AkpQLubRp5y7ayTFm6aU6e4JUTOmjX8eeBA6zRO4WpTEiMnTnBhExqqv7uhQgU+Z01UFBe3+/bxuW3uuIN/7ijdWMSTnDpl3cmqsYzcuiVlxyhx+jQXmQDw1ltSjZQGDfizratGLioFoaHA0KH8dUqK9J8EK7ZBluXKKdeekYsRNfFJzsSIKPMuzqVARE/LCIkRP+b6dWkeCXcsIwUFvLMvS5YRpZgRIUa8PcIICZH8m7aumvx8oGNHPpoXo1pXOfbetIxcviyJ0ZgYfrw++AB48EHpJuSM0lLroEdx/jkKxgOk/SUnOy+elZzM4xwYs+6kGQPWr+ev27e3/o6wjOzbZ196euNG/nzHHfpV5JSzdi2PS3rlFSnAuFkz/uxIjIg6FIAUoAw4D2CNiZEKXzly1dy8CTzxBBcrLVvyVF2BIzEit4zIGTyYi76ZMwN3igg9Ea4awLHlRS5G1AweHImRggI+oDGZpGyxQERPy0hBgXWhTn+BxAisbybipqOGpCTpZpCXVzZqjAhsLSNFRZKv0RfmTkdxI+++y0f1I0fylOKbN11XH6xUSapSmpCgXD7dFY7EiAgOTUzkN9LvvgMefZQvc1U8DOCd5/Xr/DyqVo3vJzqaf2Y775FATfAqwDvgrCz+Wu6qOXqU7zc83N5tcNtt/Dq4ft3etyxu9m3buvpV7hEebu9mE9lFSsfy+nXreh9CYAHO3TQmk+uMmuefB378kYuujz6yFhFaLCMAdzN89BHw+OPK+wo25JkyjjKLYmKk60DN4MGRGBFWkZo1lYVpoOCs6Jlay0hcnHTs/dE6QmIE1vEiWkYuJpNkJj9zpmxZRsTvOneOm7NFQGN6uuOZWvVEKaPm1i3g//5Pej9vHjflixGpo4sxNFQajbmbkupIjMjrg0RF8UDQsWP5MjVz+4i2V6/OR+smk+u4ETU1RgRKE+aJm/Zdd0kdviA0VEp/tHXVCMtIu3au96sXwrR+8KB9uvGOHVyMiv9zwwbJWubMTQM4z6j5+GNg1iy+3UWL7G+GQozs2yfFCDHmXnXfYESNZQSQ+hk9xIiwsAUqzoqeuRqMyfFnVw2JEbgXLyKQFz4rS2IkKYnfHBnjaXhKwaveRMky8sMP3A2SmMhrN5QvD6xbB8ydyz93NjIQn7l7o3BlGZHHAggh99dfruNGlFJlXYkRNTVGBKJdcsuIECP33KP8HaWMmtxcfn6Hhfk2CDM1lV+XjEmBiALhonnoIR53UFDARQtjzt00gOP/8+efgWee4a8nTeIBqLbcfjsXnteuSf//mTNcLIWGaiuoF4zIxYizmitPPMH7ATXiVx5rJQ8iFxa1QBcjjtw0ZrM0jYMrywhAYsTvEZ2+O2JE3BAOHpRGY2XBTRMSInUaZ8/6Ll5EoCRG5s3jz717A488wm9GcuuAs5GBEAh6ixHbyqkAH9GFhkpCzhlKYsRVRUm1bhrAPqPGWbyIQCmjRrhomjVzPEeIt3AUNyLESPv2UkDthg18Ph6RCuyoIqXS/3nmDNCtG//uP/4BjBun/N2wMKBuXf5auGqEVeS22/x/EjyjkbtpnFlGpkzhx1VNRk+VKtySVVwsxf8xVvbFyPnzXJCYTPaF4pQQsXj+mN5LYgTulYIXiBvC1q38OSnJ9521t5Cn9/oqk0YgxEh+Phd5584BK1fyZQMH8ueGDYFt23ibwsKcR8s//zzQtSsfbbmDFstISIgkjFy5apRM+2rdNGosI7ZiZP9+fiyjox130EpixAgXjUBJjJSWStdcy5ZSu9avlwYFJpPjIlfC7D1jBtChAw9ubNiQn2/16/O5epy582zjRrxVDK4sotZNo4XwcKm/Ev15bi7PPIuIkP6vQMWRGBHBq5Uq2c9GrIQjy8i2bTx13XZiVF+iovllHz3cNL/8wp/LgotGIMx+ublSsStfiZH4eN5p/fUXn35+yxY+Ym3a1Lqkc5Uq3C/899/OTb733OPYLaEGIUZEoSaBECNyywjAO8YzZ1zPvuuJm0aNZcS2CquwirRq5XgEX68evxHn5/Pjn5zs/eBVZyiJkYMH+X8eE8PFk3CHbdwoCcbYWClw2RZxrdsWd0tJAb76yrGIEdiKEYoXUY+aAFZ3qFqVXxsnT/KBiYgXadjQ8YzRgYIQI1eucEuImMxVbfCqQEmMFBby4Orjx7n7ccoUXZqsGRIjcK/gmUDcEERwXVkUIz/8wC+ApCTflrmvWZPfDA8f5kGFADBggP16ISHen+9DyTJy65ZUB8W2foQYpTkTI+fO8ZGbyWSdvqinGBGWkQsX+DnqKl4E4Df4GjX4cd+7l/+206f56LNFC9f71JucHP4fnzrFO9+0NMlFc+edfETYtCkXH5cu8SwYwHn2xOjR0gzdFStKj/r1XQsRgCwjnuANywjAxcjPP0uDy7LiogGsz+WiIqk/UpvWKxBiJD+fC5uYGD5R5vHjPPNu9Gi9WqydoBcj8hoMnlhGBGUhXkQgxIi4gTVp4ts6CTVr8hvLwoXcvRAVBfTs6bv9y5GLEcb4cTh9mguSiAj780CpTost4gaWmWmd1eJMjFy9KmWAqHHTxMbyDv/CBe4nFu4WR/EigkaNuBjZs0cKzL7zTvvsG19QvjyfYG7/fj7affhhSYyIYNqwMG7tWbWKWzYA52IkKUkq1e4Owjp39Cjv1B2l9RL2qA1g1YptrFVZEiMREbz/u3GDWzJEf6TVMlKhAj/3z5/n1pEdO4Bly/j189lnxqY/B33MyN9/S9PCq+ncbbH9TlmyjIjR/Y0b/NnX5ZRFeu/q1fz5H/+QfP2+Rl61U5wvIng1O9veHaBUTt8WR6NpIUaKiux9xMIqUr684+BMW4R1ZPlyvs0KFVzP0yGvxCoEjBEuGoG4oWzbxp9FWXp5JVhh7Vm3jj+rPT7uUKmSdAP46Sfpf3anum+woTaAVStyMXLrlpR9VRbECKAcN6LVMgJI1pGVK4Fhw/jrKVOkmj5G4ZYYmT17NrKzsxEVFYWcnBxsdjHHd3FxMcaNG4fMzExERkbitttuwzyRGmEwQkVXqqRcltgVtuW4y5IYsVXbvooXEdh27EouGl+hVLVTKXhVoMZN46hiZ/nykvixtY5oqTEiEO2bP58/t20r+ZwdIQ9iFfEiRgSvCuRxI6dPc7NySIj1JG6ifaL0vbdHecJVs2wZf65cObALa/mKuDipr9VTjIi+9+RJHlN0/TrflxjUBDpiICavjaPVMgJIYmT8eH6MOnYEXnhBjxZ6hmYxsnTpUowYMQLjxo3D7t270apVKzzwwAM46SgPEcBjjz2GdevW4eOPP8bhw4exZMkS1PKTSC9P4kUAbj6TFwEry2LE15YRuRjJzjZ2ZG4y2ceNKKX1CrS4aZRM+45cNVpqjAiEZUR0XGoCeYUYOXSIfy8iQt/ZW7UixMj27ZKLplEj67L0DRtaV1D2lRj58kv+7Cddmt9jMvGR+NNP63vM5DP3ChdN06aOg5gDDb0sIyK9F+Aus08+8Y9jpDlmZPr06Rg4cCAGDRoEAJg5cya+//57zJkzB1OnTrVbf/Xq1di0aROOHTuGhP85CLNEjWo/wJN4EUGVKlJue1kVI7Gxyjddb5Kdza0Rt24BTz5p/AVTsSL/n7VYRtxx0wBcjPz2m2MxosUyIsSIwFW8CMA7t0qVpPP6rrvcsxzqRb163GdeWChZeGyLr4WGAm3aSDEj3nTTAJIYEecDxYuo5/nn9d+m6MPPnQM2beKvy4qLBlAWI55YRgDg00+tY3iMRFP3XlJSgp07d6Jjx45Wyzt27IitIunfhpUrV6Jp06Z46623UKVKFdSoUQMvvPACrjuaBQzcrVNUVGT18BaeWkYAaZQaE+P9rA5fkpwsCYDGjX0vBsLDeXn15GRjXTQCW8uIo7ReQBIjBQVSAS45V65I557STcxR4bMDB/izlvNVLpZSUtTdNE0m67gSI100AD8XhJvwhx/4s9LMwXKrj68sIwKyjBhLhQpSJtTXX/PnsipGdu/mk3GKFF1ns3fb8uCDwL33Av/5D3/2FzRZRs6fPw+z2YwUGymVkpKCfGEvsuHYsWPYsmULoqKi8OWXX+L8+fMYMmQILl686DBuZOrUqZg4caKWprmNXpYRgFtFytKsnGFhXAjk5/veRSNYuZIX4hGzuBqJIzeNkmVElNO/dYunJ9u6VURl2UqVlP3mSm6aa9eA//6Xv77/fvXtlltG7rlH/TnaqBGflBAw1kUmaN5cKnQGKJell4smb4uRWrWk/xggy4jRmEy8Hz94ULIeOCuEGGiI8/mtt6R+ITSUzw6u1Ac5244Q9P6EW2Ndk01vxhizWyYoLS2FyWTCokWL0KxZM3Tq1AnTp0/HggULHFpHxo4di8LCQsvjlKOCCzqgh2VEiJGylNYrEL/N18GrApPJP4QIYC1GLl2SAsmUOgJXVVj/+IM/O8q+UBIjX3/Na4VkZWmr91G1qiRAtBR+Exk1UVHGR9oD1qPcrCxlV1XdulIMl7fdNBER1gKELCPGI++D09J8WxfJ2wgxcuoUv5579eIp5TNnlo1BsCYxkpSUhNDQUDsrSEFBgZ21RJCWloYqVaogXjZMqV27NhhjOO1gjvTIyEjExcVZPbyFHpaRTp34yLdHD33a5E+8+iovod6tm9EtMR65GBFWkdRUx7U3nGXUiLkh5MFkcpTEyKef8ucnntDmMouI4OIlLk6bReW++7hYeuYZ/xCEcjGi5KIBeKcsztU6dbzfJuGqiY3VZionvIO8H2/WrGzcpAWtW3NLXOfOPMtt0aKyNSmjJjESERGBnJwcrBG22/+xZs0atHAwVGvZsiXOnj2LK1euWJb98ccfCAkJQbo7hT10xGyWUiU9sYzk5PCbRv/+ujTLr+jShRcdU1OVsqwjFyPOglcFzjJqtIgRxnhQnqi30ru3tnYDvBjY4cPasnCSkvjIa/p07fvzBtnZkkvLkRgBgHff5b50NYG6niLESO3aZevGF6jYipGyRJcuPBV35crAn2tHCc1umpEjR+Kjjz7CvHnzcOjQITz//PM4efIkBg8eDIC7WPr27WtZv1evXkhMTMSTTz6JgwcP4scff8SLL76IAQMGoJyR4fngsRCizr+WaGQiOFGyjDjLMHKWUeNKjNjOQrp0KT9XmzZ1zx0QF6ct/c8fMZl4FkaTJs4tdRERvsv8+sc/uBD5X3IhYTBlWYwA6ibDC1Q0/7QePXrgwoULmDRpEvLy8lCvXj2sWrUKmf/Lac3Ly7OqOVK+fHmsWbMGzz33HJo2bYrExEQ89thjmDx5sn6/wk1EM8UcFQThDK2WEU/cNJGRPPMlP59bRxYu5MvdsYqUJcaN4w9/4bbbpEkkCeORi5GmTY1rB6Edt3TWkCFDMGTIEMXPFixYYLesVq1adq4df0D448ti4CmhP3IxIqbaVmMZsRUjFy5Is/868/lmZHAxsn49L4MeGspn1yQIQpmGDbkrr2FD46aOINyjDBt9XCMsI57EixDBg1yMCNeLmpgRWzeNsIpUrsxr0zgiI4NXHJ0xg7+/917/KVBEEP5IhQq8X/eHgGtCG0EtRsgyQmhBiJGCAqmOgTuWEVcuGoE4L4WY6dNHfVsJIlgxYmZpwnP8oCK9cZBlhNCC3DJSWso7PWeWCkdVWIUYcTWBl/y8jInh0fQEQRBlkaAWI6+9xnO1barbE4Qi8knYAO6icZbOmZgoRb//9Ze0XK1lRC5GunVz7tIhCIIIZILaTdO4sXFlzonAo3x5HkRqNvP3rkowh4TwuJFTp7irRtT4cEeMBHsWDUEQZZugtowQhBZMJmvriJr5IGzjRhhTL0Zq1+YTL9au7ZsCXgRBEEYR1JYRgtBKxYrA+fP8tZrCWrZVWM+dA4qKuLBx9f34eF41NSyM6uAQBFG2ITFCEBpw1zIiMmKEVSQjQ136YVKStvYRBEEEIuSmIQgNyMWIGsuIrZtGrYuGIAgimCAxQhAaEGLEZOLT2LvCVoz88Qd/JjFCEAQhQWKEIDQgxEh6Op8/xhW2VVjJMkIQBGEPiRGC0IAQI2riRQDHbhpXBc8IgiCCCRIjBKEBIUIaNVK3vhAj584BJSXAkSP8PVlGCIIgJCibhiA00KcPkJoK3H23uvUTE4HwcF4Ofvdu4OpVXgwtO9u77SQIgggkyDJCEBqIiAAefJDXAFGDySTFjWzaxJ+zsvh2CIIgCA6JEYLwMsJV8+OP/JlcNARBENaQGCEILyMsI5s382cSIwRBENaQGCEILyMsI0VF/JnECEEQhDUkRgjCywgxIiAxQhAEYQ2JEYLwMsJNIyAxQhAEYQ2JEYLwMnLLSFiYujLyBEEQwQSJEYLwMnIxUq0aFyQEQRCEBIkRgvAycjFCLhqCIAh7SIwQhJdJSJCKnJEYIQiCsIfECEF4GXkVVhIjBEEQ9pAYIQgfUL8+f27WzNh2EARB+CMUSkcQPmDhQuDYMaBxY6NbQhAE4X+QZYQgfEB8PAkRgiAIR5AYIQiCIAjCUEiMEARBEARhKBQzQhAEEYSYzWbcvHnT6GYQAU54eDhCQ0M93g6JEYIgiCCCMYb8/Hz8/fffRjeFKCNUqFABqampMJlMbm+DxAhBEEQQIYRIcnIyoqOjPbqBEMENYwzXrl1DQUEBACDNdlZQDZAYIQiCCBLMZrNFiCQmJhrdHKIMUK5cOQBAQUEBkpOT3XbZUAArQRBEkCBiRKKjow1uCVGWEOeTJzFIJEYIgiCCDHLNEHqix/lEYoQgCIIgCEMhMUIQBEEQhKGQGCEIgiA0YTYDGzcCS5bwZ7PZ6BZpp23bthgxYoTq9Y8fPw6TyYQ9e/Z4rU0AsHHjRphMpqBLvaZsGoIgCEI1K1YAw4cDp09Ly9LTgXfeAbp1039/ruIR+vXrhwULFmje7ooVKxAeHq56/YyMDOTl5SEpKUnzvgjXkBghCIIgVLFiBdC9O8CY9fIzZ/jyL77QX5Dk5eVZXi9duhSvvfYaDh8+bFkmUksFN2/eVCUyEhISNLUjNDQUqampmr5DqIfcNARBEIRLzGZuEbEVIoC0bMQI/V02qamplkd8fDxMJpPl/Y0bN1ChQgUsW7YMbdu2RVRUFBYuXIgLFy6gZ8+eSE9PR3R0NOrXr48lS5ZYbdfWTZOVlYU33ngDAwYMQGxsLKpWrYoPP/zQ8rmtm0a4U9atW4emTZsiOjoaLVq0sBJKADB58mQkJycjNjYWgwYNwpgxY9CoUSNNx2D58uWoW7cuIiMjkZWVhWnTpll9Pnv2bFSvXh1RUVFISUlB9+7dLZ998cUXqF+/PsqVK4fExER06NABV69e1bR/X0BihCAIgnDJ5s3WrhlbGANOneLr+ZqXXnoJw4YNw6FDh3Dffffhxo0byMnJwTfffIP9+/fjn//8J/r06YNt27Y53c60adPQtGlT7N69G0OGDMEzzzyD33//3el3xo0bh2nTpmHHjh0ICwvDgAEDLJ8tWrQIU6ZMwZtvvomdO3eiatWqmDNnjqbftnPnTjz22GN4/PHHsW/fPkyYMAGvvvqqxTW1Y8cODBs2DJMmTcLhw4exevVqtG7dGgC3KvXs2RMDBgzAoUOHsHHjRnTr1g1MSVEaDXODWbNmsaysLBYZGcmaNGnCfvzxR4frbtiwgQGwexw6dEj1/goLCxkAVlhY6E5zCYIgCMbY9evX2cGDB9n169c1f3fxYsa45HD+WLzYCw3/H/Pnz2fx8fGW97m5uQwAmzlzpsvvdurUiY0aNcryvk2bNmz48OGW95mZmax3796W96WlpSw5OZnNmTPHal+7d+9mjEn3trVr11q+8+233zIAluPbvHlz9uyzz1q1o2XLlqxhw4YO2ym2e+nSJcYYY7169WL33nuv1Tovvvgiq1OnDmOMseXLl7O4uDhWVFRkt62dO3cyAOz48eMO96cHzs4rtfdvzZaRpUuXYsSIERg3bhx2796NVq1a4YEHHsDJkyedfu/w4cPIy8uzPKpXr6511wRBEIRBqJ12xIPpSdymadOmVu/NZjOmTJmCBg0aIDExEeXLl8cPP/zg8j7VoEEDy2vhDhLzrqj5jpibRXzn8OHDaNasmdX6tu9dcejQIbRs2dJqWcuWLfHnn3/CbDbj3nvvRWZmJqpVq4Y+ffpg0aJFuHbtGgCgYcOGaN++PerXr49HH30Uc+fOxaVLlzTt31doFiPTp0/HwIEDMWjQINSuXRszZ85ERkaGS9NTcnKyle9PjymHCYIgCN/QqhXPmnGU3GIyARkZfD1fExMTY/V+2rRpmDFjBkaPHo3169djz549uO+++1BSUuJ0O7aBryaTCaWlpaq/IzJ/5N+xzQZiGl0kjDGn24iNjcWuXbuwZMkSpKWl4bXXXkPDhg3x999/IzQ0FGvWrMF3332HOnXq4D//+Q9q1qyJ3NxcTW3wBZrESElJCXbu3ImOHTtaLe/YsSO2bt3q9LuNGzdGWloa2rdvjw0bNjhdt7i4GEVFRVYPgiAIwjhCQ3n6LmAvSMT7mTP5ekazefNmdOnSBb1790bDhg1RrVo1/Pnnnz5vR82aNfHrr79aLduxY4embdSpUwdbtmyxWrZ161bUqFHDMqgPCwtDhw4d8NZbb+G3337D8ePHsX79egBcDLVs2RITJ07E7t27ERERgS+//NKDX+UdNKX2nj9/HmazGSkpKVbLU1JSkJ+fr/idtLQ0fPjhh8jJyUFxcTE+/fRTtG/fHhs3brQE2dgydepUTJw4UUvTCIIgCC/TrRtP31WqMzJzpnfqjLjD7bffjuXLl2Pr1q2oWLEipk+fjvz8fNSuXdun7Xjuuefw1FNPoWnTpmjRogWWLl2K3377DdWqVVO9jVGjRuGOO+7A66+/jh49euDnn3/Ge++9h9mzZwMAvvnmGxw7dgytW7dGxYoVsWrVKpSWlqJmzZrYtm0b1q1bh44dOyI5ORnbtm3DuXPnfH4c1OBWnRElk5GjwjQ1a9ZEzZo1Le/vuusunDp1Cm+//bZDMTJ27FiMHDnS8r6oqAgZGRnuNJUgCILQkW7dgC5deNZMXh6PEWnVyj8sIoJXX30Vubm5uO+++xAdHY1//vOf6Nq1KwoLC33ajieeeALHjh3DCy+8gBs3buCxxx5D//797awlzmjSpAmWLVuG1157Da+//jrS0tIwadIk9O/fHwBQoUIFrFixAhMmTMCNGzdQvXp1LFmyBHXr1sWhQ4fw448/YubMmSgqKkJmZiamTZuGBx54wEu/2H1MTIMDq6SkBNHR0fj888/xyCOPWJYPHz4ce/bswaZNm1RtZ8qUKVi4cCEOHTqkav2ioiLEx8ejsLAQcXFxaptLEARByLhx4wZyc3ORnZ2NqKgoo5sTlNx7771ITU3Fp59+anRTdMPZeaX2/q0pZiQiIgI5OTlYs2aN1fI1a9agRYsWqreze/duS9QxQRAEQZRFrl27hunTp+PAgQP4/fffMX78eKxduxb9+vUzuml+h2Y3zciRI9GnTx80bdoUd911Fz788EOcPHkSgwcPBsBdLGfOnMEnn3wCAJg5cyaysrJQt25dlJSUYOHChVi+fDmWL1+u7y8hCIIgCD/CZDJh1apVmDx5MoqLi1GzZk0sX74cHTp0MLppfodmMdKjRw9cuHABkyZNQl5eHurVq4dVq1YhMzMTAK/4Js/lLikpwQsvvIAzZ86gXLlyqFu3Lr799lt06tRJv19BEARBEH5GuXLlsHbtWqObERBoihkxCooZIQiC8ByKGSG8gc9jRgiCIAiCIPSGxAhBEARBEIZCYoQgCIIgCEMhMUIQBEEQhKGQGCEIgiAIwlBIjBAEQRBlnrZt22LEiBGW91lZWZg5c6bT75hMJnz11Vce71uv7ThjwoQJaNSokVf34U1IjBAEQRB+S+fOnR0WCfv5559hMpmwa9cuzdvdvn07/vnPf3raPCscCYK8vDy/nA/GnyAxQhAEQfgtAwcOxPr163HixAm7z+bNm4dGjRqhSZMmmrdbqVIlREdH69FEl6SmpiIyMtIn+wpUSIwQBEEEMYwBV6/6/qG23OZDDz2E5ORkLFiwwGr5tWvXsHTpUgwcOBAXLlxAz549kZ6ejujoaNSvXx9Llixxul1bN82ff/6J1q1bIyoqCnXq1LGbgw0AXnrpJdSoUQPR0dGoVq0aXn31Vdy8eRMAsGDBAkycOBF79+6FyWSCyWSytNnWTbNv3z7cc889KFeuHBITE/HPf/4TV65csXzev39/dO3aFW+//TbS0tKQmJiIZ5991rIvNZSWlmLSpElIT09HZGQkGjVqhNWrV1s+LykpwdChQ5GWloaoqChkZWVh6tSpls8nTJiAqlWrIjIyEpUrV8awYcNU79sdNJeDJwiCIMoO164B5cv7fr9XrgAxMa7XCwsLQ9++fbFgwQK89tprMJlMAIDPP/8cJSUleOKJJ3Dt2jXk5OTgpZdeQlxcHL799lv06dMH1apVQ/PmzV3uo7S0FN26dUNSUhJ++eUXFBUVWcWXCGJjY7FgwQJUrlwZ+/btw1NPPYXY2FiMHj0aPXr0wP79+7F69WpLCfj4+Hi7bVy7dg33338/7rzzTmzfvh0FBQUYNGgQhg4daiW4NmzYgLS0NGzYsAFHjhxBjx490KhRIzz11FOuDxqAd955B9OmTcMHH3yAxo0bY968eXj44Ydx4MABVK9eHe+++y5WrlyJZcuWoWrVqjh16hROnToFAPjiiy8wY8YMfPbZZ6hbty7y8/Oxd+9eVft1GxYAFBYWMgCssLDQ6KYQBEEELNevX2cHDx5k169ftyy7coUxbqfw7ePKFfXtPnToEAPA1q9fb1nWunVr1rNnT4ff6dSpExs1apTlfZs2bdjw4cMt7zMzM9mMGTMYY4x9//33LDQ0lJ06dcry+XfffccAsC+//NLhPt566y2Wk5NjeT9+/HjWsGFDu/Xk2/nwww9ZxYoV2RXZAfj2229ZSEgIy8/PZ4wx1q9fP5aZmclu3bplWefRRx9lPXr0cNgW231XrlyZTZkyxWqdO+64gw0ZMoQxxthzzz3H7rnnHlZaWmq3rWnTprEaNWqwkpISh/uTo3ReCdTev8kyQhAEEcRER3MrhRH7VUutWrXQokULzJs3D+3atcPRo0exefNm/PDDDwAAs9mMf/3rX1i6dCnOnDmD4uJiFBcXI0aN6QXAoUOHULVqVaSnp1uW3XXXXXbrffHFF5g5cyaOHDmCK1eu4NatW5rnSzt06BAaNmxo1baWLVuitLQUhw8fRkpKCgCgbt26CA0NtayTlpaGffv2qdpHUVERzp49i5YtW1otb9mypcXC0b9/f9x7772oWbMm7r//fjz00EPo2LEjAODRRx/FzJkzUa1aNdx///3o1KkTOnfujLAw70kGihkhCIIIYkwm7i7x9eN/3hbVDBw4EMuXL0dRURHmz5+PzMxMtG/fHgAwbdo0zJgxA6NHj8b69euxZ88e3HfffSgpKVG1baYQwGKyaeAvv/yCxx9/HA888AC++eYb7N69G+PGjVO9D/m+bLettM/w8HC7z0pLSzXty3Y/8n03adIEubm5eP3113H9+nU89thj6N69OwAgIyMDhw8fxqxZs1CuXDkMGTIErVu31hSzohUSIwRBEITf89hjjyE0NBSLFy/G//3f/+HJJ5+03Fg3b96MLl26oHfv3mjYsCGqVauGP//8U/W269Spg5MnT+Ls2bOWZT///LPVOj/99BMyMzMxbtw4NG3aFNWrV7fL8ImIiIDZbHa5rz179uDq1atW2w4JCUGNGjVUt9kZcXFxqFy5MrZs2WK1fOvWrahdu7bVej169MDcuXOxdOlSLF++HBcvXgQAlCtXDg8//DDeffddbNy4ET///LNqy4w7kJuGIAiC8HvKly+PHj164OWXX0ZhYSH69+9v+ez222/H8uXLsXXrVlSsWBHTp09Hfn6+1Y3XGR06dEDNmjXRt29fTJs2DUVFRRg3bpzVOrfffjtOnjyJzz77DHfccQe+/fZbfPnll1brZGVlITc3F3v27EF6ejpiY2PtUnqfeOIJjB8/Hv369cOECRNw7tw5PPfcc+jTp4/FRaMHL774IsaPH4/bbrsNjRo1wvz587Fnzx4sWrQIADBjxgykpaWhUaNGCAkJweeff47U1FRUqFABCxYsgNlsRvPmzREdHY1PP/0U5cqVQ2Zmpm7ts4UsIwRBEERAMHDgQFy6dAkdOnRA1apVLctfffVVNGnSBPfddx/atm2L1NRUdO3aVfV2Q0JC8OWXX6K4uBjNmjXDoEGDMGXKFKt1unTpgueffx5Dhw5Fo0aNsHXrVrz66qtW6/zjH//A/fffj3bt2qFSpUqK6cXR0dH4/vvvcfHiRdxxxx3o3r072rdvj/fee0/bwXDBsGHDMGrUKIwaNQr169fH6tWrsXLlSlSvXh0AF3dvvvkmmjZtijvuuAPHjx/HqlWrEBISggoVKmDu3Llo2bIlGjRogHXr1uHrr79GYmKirm2UY2JKzjI/o6ioCPHx8SgsLNQcLEQQBEFwbty4gdzcXGRnZyMqKsro5hBlBGfnldr7N1lGCIIgCIIwFBIjBEEQBEEYCokRgiAIgiAMhcQIQRAEQRCGQmKEIAgiyAiAvAUigNDjfCIxQhAEESSIqp7Xrl0zuCVEWUKcT7ZVY7VARc8IgiCChNDQUFSoUAEFBQUAeM0LR6XJCcIVjDFcu3YNBQUFqFChgtVcOlohMUIQBBFEpKamAoBFkBCEp1SoUMFyXrkLiRGCIIggwmQyIS0tDcnJyV6d+IwIDsLDwz2yiAhIjBAEQQQhoaGhutxECEIPKICVIAiCIAhDITFCEARBEIShkBghCIIgCMJQSIwQBEEQBGEoJEYIgiAIgjAUEiMEQRAEQRgKiRGCIAiCIAyFxAhBEARBEIZCYoQgCIIgCEMhMUIQBEEQhKGQGCEIgiAIwlBIjBAEQRAEYSgkRgiCIAiCMBQSIwRBEARBGAqJEYIgCIIgDIXECEEQBEEQhuKWGJk9ezays7MRFRWFnJwcbN68WdX3fvrpJ4SFhaFRo0bu7JYgCIIgiDKIZjGydOlSjBgxAuPGjcPu3bvRqlUrPPDAAzh58qTT7xUWFqJv375o3769240lCIIgCKLsYWKMMS1faN68OZo0aYI5c+ZYltWuXRtdu3bF1KlTHX7v8ccfR/Xq1REaGoqvvvoKe/bsUb3PoqIixMfHo7CwEHFxcVqaSxAEQRCEQai9f2uyjJSUlGDnzp3o2LGj1fKOHTti69atDr83f/58HD16FOPHj1e1n+LiYhQVFVk9CIIgCIIom2gSI+fPn4fZbEZKSorV8pSUFOTn5yt+588//8SYMWOwaNEihIWFqdrP1KlTER8fb3lkZGRoaSZBEARBEAGEWwGsJpPJ6j1jzG4ZAJjNZvTq1QsTJ05EjRo1VG9/7NixKCwstDxOnTrlTjMJgiAIgggA1Jkq/kdSUhJCQ0PtrCAFBQV21hIAuHz5Mnbs2IHdu3dj6NChAIDS0lIwxhAWFoYffvgB99xzj933IiMjERkZqaVpBEEQBEEEKJosIxEREcjJycGaNWuslq9ZswYtWrSwWz8uLg779u3Dnj17LI/BgwejZs2a2LNnD5o3b+5Z6wmCIAiCCHg0WUYAYOTIkejTpw+aNm2Ku+66Cx9++CFOnjyJwYMHA+AuljNnzuCTTz5BSEgI6tWrZ/X95ORkREVF2S0nCIIgCCI40SxGevTogQsXLmDSpEnIy8tDvXr1sGrVKmRmZgIA8vLyXNYcIQiCIAiCEGiuM2IEVGeEIAiCIAIPr9QZIQiCIAiC0BsSIwRBEARBGAqJEYIgCIIgDIXECEEQBEEQhkJihCAIgiAIQyExQhAEQRCEoZAYIQiCIAjCUEiMEARBEARhKCRGCIIgCIIwFBIjBEEQBEEYCokRgiAIgiAMRfNEeWUFsxnYvBnIywPS0oBWrYDQUKNbRRAEQRDBR1CKkRUrgOHDgdOnpWXp6cA77wDduhnXLoIgCIIIRoLOTbNiBdC9u7UQAYAzZ/jyFSuMaRdBEARBBCtBJUbMZm4RYcz+M7FsxAi+HkEQBEEQviGoxMjmzfYWETmMAadO8fUIgiAIgvANQSVG8vL0XY8gCIIgCM8JKjGSlqbvegRBEARBeE5QiZFWrXjWjMmk/LnJBGRk8PUIgiAIgvANQSVGQkN5+i5gL0jE+5kzqd4IQRAEQfiSoBIjAK8j8sUXQJUq1svT0/lyqjNCEARBEL4lKIuedesGdOlCFVgJgiAIwh8ISjECcOHRtq3RrbCGStQTBEEQwUjQihFv4o6ooBL1BEEQRLASdDEj3mbFCiArC2jXDujViz9nZTkvM08l6gmCIIhghsSIjrgjKqhEPUEQBBHskBjRCXdFBZWoJwiCIIIdEiM64a6ooBL1BEEQRLBDAawyPMlmcVdUUIl6giAIItghMfI/PM1mcVdUiBL1Z84ou3hMJv65L0rUU2oxQRAEYQTkpoE+2SzuznvjLyXq3ckCIgiCIAg9CHoxolc2iyeiwugS9ZRaTBAEQRiJiTGl27B/UVRUhPj4eBQWFiIuLk7XbW/cyK0ArtiwQV3FViV3T0YGFyKuRIURbhKzmVtAHAXfCjdRbi65bAiCIAhtqL1/B33MiN7ZLJ7Me2NEiXotWUD+Vj6fIAiCKBsEvRjxRjaLP8574whKLSYIgiCMJuhjRtwNPC0rUGoxQRAEYTRBL0b8JZvFKIJdjPkCs5nHJi1Zwp/1LO3vzW0TBEH4iqAXI4DzbJalS4GEhLLX2Yub2LJlwFNP8WXBKMa8jTdTpikdmyCIskLQZ9PIsc1mOX8eeP559wuh+StKGT+Jifz5wgVpmdosIEIZkTJte4UJkedJ2rY3t00QBKEXau/fJEYcUFY7e2e/izFg4kSgenWqwOop3kyZpnRsgiACBRIjHlBWO3t/+l1lvfS83vVrfLVtgiAIPVF7/6aYEQXcnYHX3/GX3xUMsQ7eTJmmdGyCIMoaJEYUUNuJr1sXWAGt/nATC5bS895MmQ60dGzK+CEIwhUkRhRQ24lPnhxYI3qjb2J6zQOkV1u8eYP0Zsp0IKVjB4MVjCAIz3FLjMyePRvZ2dmIiopCTk4ONjux62/ZsgUtW7ZEYmIiypUrh1q1amHGjBluN9gXuOrs5fh6RO/JTdTom1gwuYm8Wb8mUGrjBIsVjCAIHWAa+eyzz1h4eDibO3cuO3jwIBs+fDiLiYlhJ06cUFx/165dbPHixWz//v0sNzeXffrppyw6Opp98MEHqvdZWFjIALDCwkKtzXWb5csZM5n4g98mHT9MJsYyMhi7dcv7bUpPt953ejpfrmUbSr9LLNOyLa0sXuz6WAJ8PW8hfr/Sf+iN36/0n2Vk6LMfb27bU27dsm+bEdcMQRDGovb+rTmbpnnz5mjSpAnmzJljWVa7dm107doVU6dOVbWNbt26ISYmBp9++qni58XFxSguLra8LyoqQkZGhk9TewHlehzO0JK9oDWbRM9UY09mFvYEPbJAPMnCMSqbyJuZQ/6alUQZPwRBABqyYbUonOLiYhYaGspWrFhhtXzYsGGsdevWqraxa9culpKSwubOnetwnfHjxzMAdg9fWkYEt24x9sorno/ob91ibMMGvs7EidosHN4YZcrbs2GDb0ao4nc4sja5+h2eWoY2bFD3P27YoNcvDl78wQpGEITxqLWMaIoZOX/+PMxmM1JSUqyWp6SkID8/3+l309PTERkZiaZNm+LZZ5/FoEGDHK47duxYFBYWWh6nTp3S0kxdCQ0F2rdXt66jwE/bGIXx47X50b0RayFmFu7Zkz/7YjTtSayDHvEH/pBNFCwYHSztDMruIQj/w60AVpPNnYQxZrfMls2bN2PHjh14//33MXPmTCxZssThupGRkYiLi7N6GIkngZ+ObqK2OMsmCbSbqLPO3tk8QI5cTXpl4fjzDbKsYXSwtCMou0c/SNQRuqLF3KKHm4Yxxl5//XVWo0YN1esbEcBqizuBn67cK2rdBIHkXlDrSlHjJhLrqHWTzZjh3N3kqZuI0IaRwdLO2uOr4OWyjB7B9ERwoPb+rUmMMMZYs2bN2DPPPGO1rHbt2mzMmDGqtzFp0iSWmZmpen1/ECOMac9eUCsiXPnRjbqJao0r8bSzdxVXo+bhqkP0txtkWcdfMn4ou0c/SNQRWvCaGBGpvR9//DE7ePAgGzFiBIuJiWHHjx9njDE2ZswY1qdPH8v67733Hlu5ciX7448/2B9//MHmzZvH4uLi2Lhx43T/Mb5Ayw1abRCfGguHr2+iWkc+nnb2Svtz56HmePjLDTJYMCJY2pZAsi76MyTqCK14TYwwxtisWbNYZmYmi4iIYE2aNGGbNm2yfNavXz/Wpk0by/t3332X1a1bl0VHR7O4uDjWuHFjNnv2bGY2m1Xvz5/EiBa0WkbcuWF74ybqzsjHk87e0f48ESSuOkTbG2RxsfE3TMJ7UHaPPpCoI7TiVTHiawJVjLhyr7hj4fD2KNPdkY+7nb27cTV6dojk/y770E1UH0jUEVrxSmovoQ1nqay2OMsmsd2mq5RcT6Lc3U0jdjdTxdX+PEFNdhGVLA8O/DW7J9CgjDTCW5AY8TLOUlknTgQWL+ZVKHNz9al+6mnqortpxO529t5MR3bVIfrTxH2EdwmU+Xz8HRJ1hLcgMeIDunUDjh/nokOIj+PHgdde07fomB6jfHdHPu529lpHUKJkux4dor9M3Ef4Bndq3BDWkKgjvIXmuWmMQHVt+yBGr3lXxHbOnFG2GLjajtZ5b1ztz3bfAL9xAFxgAdbfU5qrx9H8LUuWcOuRKxYv5qKRCExs//8WLYCtW/1vPp9Awqj5rYjAwytz0xhFoAaweoqWYFW1AXqvvOJ6W56mEbtbn8RVoK9t5pCa7CJnwanBEtToD6m1RkHByd4jmM8rQj2UTRPgaK1kOnSotkwTNcXBfFmLw9HvnThRXZVWpXVcpSgvW1b2K7IG882YinMR/kiwiTi1929y0/ghIvbD9p+xdUEomUrVouTOsMXX09PruT+1bqvp04HHHuPLXLl79G6jVrTuW+15VBbRy21ZFjDynCWsUeqz09N5HE5ZvRbJTROgqK3z8fnnnhcKKwsjf0doccGotQIZaWXQsu9btxhbu5axhATv//f+OsojFxwnmC1j/kawWurITROgqO1EK1XyTIjo1SH7681Ia3EmNZ262o5E72OiZd9ay+p78t/7840uGIpzuTr+wXrz80eCuYw+iZEAxd35bDx5uNsh6zlDr57cusVn8PX0ZizavXCha/GXkMCtEZ9/ru8NWksn5k5ZfU/+e3++0ZV1y4jaeKhgvPn5I2X9fHQGiZEAxd2ZfpUeXbt67wJQezPy9ehZrWXAVxP3eXqDVns+rF3rXnvd+e8DYZQXKDNdu7sPV8dfreVU75ufv1pKjSYYLHWOIDESoKjpRNV2NOIGpXeH7GlcizdnGtZjHiC9J+7z5Fir7cReeUV7mypV4lYfrTcNfx7lyW+GEyf690zX7qLngEWtm1IN/uy2Mxp/vma8DYkRH+KtGAFHnaiWlFRPa4YooUdci94jUy0T7jlLUfbmxH3OOhtH55CW+jGetEvLTcNfR3lKN8PERP5Q+/97sm9fCW89XbmOAri1igh/d9sZjVGWOn+AxIiP8NZowFWGhxaRoXfNEL07Qz1Qe9OeMUOf4nHuPpRu0I7OoWXL1GfFrF3rWbu03DT8cZTn7GYIuK5X4wm+dltpGQy4uvnpYb0MBLedP+CNgWEgQGLEB3h7NOBO2p4jkaGn9cYbZmJP0Wu07u0AYtsbtCcuIfl55mrkBTBWsSJjSUme3zT0GOXpeT4afTP0tThTe/yF0HBlYfX0uPmjOPVXfF1M0h8gMeJljO4A5e3wdcCYnnEtvraMuNqftywjSueDpy4hpdL3zm4+Eyfq9594MsrT25po9M3QCLeV2uPv7Oan13HzV7edv+Junx2owcEkRryM0R2g0egZ16IHevlk1VgYkpKcu06U9q10g3ZX+Ig0YqXf4uzm443aK1pHed6wJhp9MzSqL1B7/B39j3odt2DvC31BIAcHkxjxMkZ3gP6AnnEterVHj/2p2Y7ayf2c3SA8CTpVUx/F3WBYLUGNWkZr3rImGn0zNDI40ZPRsl7HLZiDM31BoAcHkxjxMkZ3gP6CN0bPnqDX/tRsx9E6y5ZpPyZaH+6IXK2xBu50fs7OB29dM/5wMwzE4EQ9j1sg/n5/wdk14y/hAJ5AYsTL+EMHGCgYUYFVj/2p2Y7WfelVw8RdkevKojNsmPsp2a6sKd60JvrDzTAQgxP1PG6B+PuNxtU1UxYGvSRGfIA/dIBE4KBHDRM9RK5SBxga6pkYUmNK9nbHqvfN0B1RG4hBhnoet0D8/Uah5prRUvTQX481iREfEWyjAeps3MfTTB09Ra74H0eMcK8tcuuFWlNycbH3rYl6nZ+BHDDoDmXlug6U36H2mtFSP8hfz08SIz4kUC4ATwm2DlpvtIxylCbc01vkemKpkVsvtAbG+rs1MdADBoOVQOqf1F4zL7/svHidHuent+9fJEYIXaEO2nO0uim83Um4Y6lRsl5ojQXxZ2ui1oDBYBmI+DuB1j95q7iiVuuiLwQciRFCN8pCRLc/4G9Bz1o7RE/rpcitKf56E/dG+jPhXQKxf/L2tBNaChd6W8CpvX+HgCBcsHkzcPq0488ZA06d4usRjgkNBd55h782maw/E+9nzuTr+YK0NG3rp6cDX3wBdOtmvbxVK/6Z7W8SmExARgZfTxAaCrRtC/TsyZ999ZtdkZenbr1Zs4Du3e2vizNn+PIVK/Rvm9kMbNwILFnCn81m/fcRiARi/+TqmnFEbKy69Vydx2YzMHw4Pza2iGUjRvj2HCMxQrhEbQetdr1gpls3fkOvUsV6uaMbvTdR0yFWqgQsXAhs2ADk5iq3z99ElieoFWhffOHbjnzFCiArC2jXDujViz9nZXlH9AQaRvVPSuJQrWB0ds044/Jldeu5Oo/9UsDpY4jxLuSmMZaykOvub/iLm0JLQKk3C9z5y/FQMx2AnqZyNQRaPISvMaJ/UjrXExP5Q4vbzp0CiAkJnrt6fVlBnGJGCN3wt1gHQl/crTbraXl4rdv2FVpK/avpyD0RWoEYD+EKvYWnr/snLYULtVQtVjs9xMSJnmek+VLAkRghdCUQUjIJ93F2g/DmyNxfR/16lOz3JMhV6w0qUKyS3hKevuqf3EmHVyuGtIgqTzPSfCngSIwQuuPPKZmEd/DmyNzfR/3uTmbo6Rw/7gghf56Q01WBPbWCwR/mwfIkC0ZLhoseblM99+UJJEYIr+Avvn3CN3jTnBsIsUhabz6iI1+2zD2h5e7cRf5qGVErrFwJT2+6CZVwtB1P6oOoFYy+HPT5Yl9q799hPoyVJcoAIiWTCA68makQCFlaIuPozBneVbsiPZ1nDiUkqM9WENeTs3RLR5hMfJ/ytGlXmM18v3l5POuiVSvvZDqtWMHTnNX8HqXj4Wo7Io1anoWmR/+0YgX/H+T/X3o6z37Rmg4vR+13u3UDunTR5z9y9V/ruS9PITFCEIRD1Hag7nTS3ty2XogUzO7d+Y1ffkMU7ydOBKpXt+7IlyxRt3250HKVbmmLO2nTzm608rRtTwWLO8IKkI6H2P+ZM8DzzytvhzF+DEaM4DdUPW6groTP0qXaxCngnmD0tqiS/9d+M8DUzxjjPchNQxDG4M1At0DK0tJqznbHBaXVBaDVnK42WFiPIFN3YyscBf36wk2lJji1UiXGhg+Xjpsa95MRgdj+FBhOMSMEQeiCNwPdAilLS0s8gjtCS+0N/JVXvJci7G7QrS3uTDXgbP+uHnoE8GoVUKGh1u+V6owYEeDvb4HhJEYIgtANbwa6Odr2smWBHSytVWh501Kk9kZbqZI+NzEtN3a1Qb/OHnpYRtwNTh0xQjo//SHA398CwymAlSAI3fBmoJvSts+f57ECrvzd/owo/W/rt69SBXjqKaC4mJcMF8fRVXwK4H5ZfbVBwOfOOf6MMcdBprZoCfxVG/TriIQEqRS7J+ejO7FJJhOwfDnw9tvSvo2OvwiEwHBFfKONPIMsIwQRPPiTv1sP5KPliRNdx2N4wwql5yyxWlJUnVWylVsUGPMsbVbpOGrFk6kAHFkZjLCUBKplhMQIQRB+g5ogwoQExtauDVy3jRqRZUTJdGcuGndvYlqElaeCyZsxTO4INKOmOfC3wHC1928TY4wZa5txTVFREeLj41FYWIi4uDijm0MQhJfYuJHPSKuG9HRg+nQ+s7DRNRJcYTbzWXYduSFE+mdurvfaL9JWAX5bku8b4GmrI0c6dq2420a1acLiGDlz7SQlAaWlwMWLyp/rcRyVUmJdsWGDtXvGUYqwONbenqHb1X/tyxnCVd+/fSKNPIQsIwQRHBhtqvcW/mI6d2WpMDq7ydX+J070/DiqsTqJdRYu5BYjLVYGI7NZXLkEjcjuoQBWgiACDk8LnClV5fQH/CWo0FUgsqOgWxFk6u1j6mr/xcXqtuPoOLpTCKxcOW1Bxa6K1zGmPhBYC0q/rUoV5aJ8fok7SmfWrFksKyuLRUZGsiZNmrAff/zR4brLly9nHTp0YElJSSw2NpbdeeedbPXq1Zr2R5YRgggOPAkiNMonrgZ/sYyoxegUVUf79+Q4ehIYrSX2Ra11T8/JDf056NtrMSNLly5Fnz59MHv2bLRs2RIffPABPvroIxw8eBBVq1a1W3/EiBGoXLky2rVrhwoVKmD+/Pl4++23sW3bNjRu3FjVPilmhCCCB0f+bq3Y+vGNRE08RKVKwIwZfDTrjyNYX81p46oNzo6jo5gRPWJ21P5+tXFPep2f/hCP5AyvxYw0a9aMDR482GpZrVq12JgxY1Rvo06dOmzixImq1yfLCEEEF+6UBPdk5OkLS4CWTA1/i30xKjPEUVu0xrX40jLl62wWf7e6qb1/h2hROCUlJdi5cyc6duxotbxjx47YunWrqm2Ulpbi8uXLSEhIcLhOcXExioqKrB4EQQQP3boBx48Da9fyolbuoDb+ZMUKPrJs1w7o1Ys/Z2Xx5Xoi4iGqVHG9roh90bsN7iAsVbYjb6Pa6Og4pqc7jhXyZcyOKF4HSHElAk+L1ynhL/FInqJJjJw/fx5msxkpKSlWy1NSUpCfn69qG9OmTcPVq1fx2GOPOVxn6tSpiI+PtzwyMjK0NJMgiDJAaCjQvj0wdy7vxG07dkeYTEBGhrpZUn19oxUia8MGYOFC7ppRQrggRozgZnijcDb7rpFtlB/HxYv5c26u4wBbX88Q7Y5gcpdAmP1aFVrMLWfOnGEA2NatW62WT548mdWsWdPl9xcvXsyio6PZmjVrnK5348YNVlhYaHmcOnWK3DQEEcSoddtoCdgzekIxfzevB0ob1WBUITBfuP/8rciZLV5x0yQlJSE0NNTOClJQUGBnLbFl6dKlGDhwIJYtW4YOHTo4XTcyMhJxcXFWD4IgghelkfDnn/ORphwtI08tKZjeIBDM64HQRjX42nUi32/btkDPnvzZGwGkRv02vdEkRiIiIpCTk4M1a9ZYLV+zZg1atGjh8HtLlixB//79sXjxYjz44IPutZQgiKDGtmPv3l2bqd4Wo2+0gWBeD4Q2qsWXrhNfUxZ+m9upve+//z7uuusufPjhh5g7dy4OHDiAzMxMjB07FmfOnMEnn3wCgAuRvn374p133kE32REpV64c4uPjVe2TUnsJgtAbX6dg2uJumqovCYQ2akUpRRcwPm1ZD/wh/doWr5aDnzVrFsvMzGQRERGsSZMmbNOmTZbP+vXrx9q0aWN536ZNGwbA7tGvXz/V+6PUXoIg9MYffO1Gl18vK230BH9KWy6L0ER5BEEQLvCHCcWUynhnZPim/LpavN1Go0b0Rk9oFwyovX+TGCEIIqjxBzGg183Ymzd1b21b7Xwx7uCszf5eudRb+Fr4kRghCIJQiT/62rXizZu6t/CmZcLV8TA6ZsgIjDhHSIwQBEEECYHobvCmZULN8Sgu5hV3XbF4Mc/gCnSMOkfU3r81pfYSBEEQ/oW/Vkl1hbfqvKg9HsnJ6rYXCGnLrgiEc4TECEEQRABjdPE2d/FWnRe1xwPglhdH0wxomVbA3wmEc4TECEEQRABjdPE2d/FWQTW1v7OgoGxULlVDIJwjJEYIgiACmECtktqqlXcsE1qOR1moXKqGQDhHKICVIAgigAnkKqneqPPizvEoC9lUzjDyHKEAVoIgiCAgkCdK84Zlwp3j4YsJ7YwkEM4REiMEQRABTiC7G5RmZNYy4aGjbQbq8fAW/n5MyE1DEARRRijr7gat0PGwhyqwegCJEYIgCIIIPChmhCAIgiCIgIDECEEQBEEQhkJihCAIgiAIQyExQhAEQRCEoZAYIQiCIAjCUEiMEARBEARhKCRGCIIgCIIwFBIjBEEQBEEYCokRgiAIgiAMJczoBqhBFIktKioyuCUEQRAEQahF3LddFXsPCDFy+fJlAEBGRobBLSEIgiAIQiuXL19GfHy8w88DYm6a0tJSnD17FrGxsTDZzn/sAUVFRcjIyMCpU6dozhsvQ8fat9Dx9h10rH0HHWvfodexZozh8uXLqFy5MkJCHEeGBIRlJCQkBOnp6V7bflxcHJ3YPoKOtW+h4+076Fj7DjrWvkOPY+3MIiKgAFaCIAiCIAyFxAhBEARBEIYS1GIkMjIS48ePR2RkpNFNKfPQsfYtdLx9Bx1r30HH2nf4+lgHRAArQRAEQRBll6C2jBAEQRAEYTwkRgiCIAiCMBQSIwRBEARBGAqJEYIgCIIgDIXECEEQBEEQhhLUYmT27NnIzs5GVFQUcnJysHnzZqObFPBMnToVd9xxB2JjY5GcnIyuXbvi8OHDVuswxjBhwgRUrlwZ5cqVQ9u2bXHgwAGDWlw2mDp1KkwmE0aMGGFZRsdZX86cOYPevXsjMTER0dHRaNSoEXbu3Gn5nI63Pty6dQuvvPIKsrOzUa5cOVSrVg2TJk1CaWmpZR061u7x448/onPnzqhcuTJMJhO++uorq8/VHNfi4mI899xzSEpKQkxMDB5++GGcPn3a88axIOWzzz5j4eHhbO7cuezgwYNs+PDhLCYmhp04ccLopgU09913H5s/fz7bv38/27NnD3vwwQdZ1apV2ZUrVyzr/Otf/2KxsbFs+fLlbN++faxHjx4sLS2NFRUVGdjywOXXX39lWVlZrEGDBmz48OGW5XSc9ePixYssMzOT9e/fn23bto3l5uaytWvXsiNHjljWoeOtD5MnT2aJiYnsm2++Ybm5uezzzz9n5cuXZzNnzrSsQ8faPVatWsXGjRvHli9fzgCwL7/80upzNcd18ODBrEqVKmzNmjVs165drF27dqxhw4bs1q1bHrUtaMVIs2bN2ODBg62W1apVi40ZM8agFpVNCgoKGAC2adMmxhhjpaWlLDU1lf3rX/+yrHPjxg0WHx/P3n//faOaGbBcvnyZVa9ena1Zs4a1adPGIkboOOvLSy+9xO6++26Hn9Px1o8HH3yQDRgwwGpZt27dWO/evRljdKz1wlaMqDmuf//9NwsPD2efffaZZZ0zZ86wkJAQtnr1ao/aE5RumpKSEuzcuRMdO3a0Wt6xY0ds3brVoFaVTQoLCwEACQkJAIDc3Fzk5+dbHfvIyEi0adOGjr0bPPvss3jwwQfRoUMHq+V0nPVl5cqVaNq0KR599FEkJyejcePGmDt3ruVzOt76cffdd2PdunX4448/AAB79+7Fli1b0KlTJwB0rL2FmuO6c+dO3Lx502qdypUro169eh4f+4CYtVdvzp8/D7PZjJSUFKvlKSkpyM/PN6hVZQ/GGEaOHIm7774b9erVAwDL8VU69idOnPB5GwOZzz77DLt27cL27dvtPqPjrC/Hjh3DnDlzMHLkSLz88sv49ddfMWzYMERGRqJv3750vHXkpZdeQmFhIWrVqoXQ0FCYzWZMmTIFPXv2BEDntrdQc1zz8/MRERGBihUr2q3j6b0zKMWIwGQyWb1njNktI9xn6NCh+O2337Blyxa7z+jYe8apU6cwfPhw/PDDD4iKinK4Hh1nfSgtLUXTpk3xxhtvAAAaN26MAwcOYM6cOejbt69lPTrenrN06VIsXLgQixcvRt26dbFnzx6MGDEClStXRr9+/Szr0bH2Du4cVz2OfVC6aZKSkhAaGmqn5AoKCuxUIeEezz33HFauXIkNGzYgPT3dsjw1NRUA6Nh7yM6dO1FQUICcnByEhYUhLCwMmzZtwrvvvouwsDDLsaTjrA9paWmoU6eO1bLatWvj5MmTAOi81pMXX3wRY8aMweOPP4769eujT58+eP755zF16lQAdKy9hZrjmpqaipKSEly6dMnhOu4SlGIkIiICOTk5WLNmjdXyNWvWoEWLFga1qmzAGMPQoUOxYsUKrF+/HtnZ2VafZ2dnIzU11erYl5SUYNOmTXTsNdC+fXvs27cPe/bssTyaNm2KJ554Anv27EG1atXoOOtIy5Yt7VLU//jjD2RmZgKg81pPrl27hpAQ61tTaGioJbWXjrV3UHNcc3JyEB4ebrVOXl4e9u/f7/mx9yj8NYARqb0ff/wxO3jwIBsxYgSLiYlhx48fN7ppAc0zzzzD4uPj2caNG1leXp7lce3aNcs6//rXv1h8fDxbsWIF27dvH+vZsyel5emAPJuGMTrOevLrr7+ysLAwNmXKFPbnn3+yRYsWsejoaLZw4ULLOnS89aFfv36sSpUqltTeFStWsKSkJDZ69GjLOnSs3ePy5cts9+7dbPfu3QwAmz59Otu9e7elpIWa4zp48GCWnp7O1q5dy3bt2sXuueceSu31lFmzZrHMzEwWERHBmjRpYkk/JdwHgOJj/vz5lnVKS0vZ+PHjWWpqKouMjGStW7dm+/btM67RZQRbMULHWV++/vprVq9ePRYZGclq1arFPvzwQ6vP6XjrQ1FRERs+fDirWrUqi4qKYtWqVWPjxo1jxcXFlnXoWLvHhg0bFPvnfv36McbUHdfr16+zoUOHsoSEBFauXDn20EMPsZMnT3rcNhNjjHlmWyEIgiAIgnCfoIwZIQiCIAjCfyAxQhAEQRCEoZAYIQiCIAjCUEiMEARBEARhKCRGCIIgCIIwFBIjBEEQBEEYCokRgiAIgiAMhcQIQRAEQRCGQmKEIAiCIAhDITFCEARBEIShkBghCIIgCMJQ/h8R3YxrK4Le/AAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "#PLOT\n",
    "acc = history.history['accuracy']\n",
    "val_acc = history.history['val_accuracy']\n",
    "loss = history.history['loss']\n",
    "val_loss = history.history['val_loss']\n",
    "\n",
    "epochs = range(len(acc))\n",
    "\n",
    "plt.plot(epochs, acc, 'bo', label='Training acc')\n",
    "plt.plot(epochs, val_acc, 'b', label='Validation acc')\n",
    "plt.title('Training and validation accuracy')\n",
    "plt.legend()\n",
    "\n",
    "plt.figure()\n",
    "\n",
    "plt.plot(epochs, loss, 'bo', label='Training loss')\n",
    "plt.plot(epochs, val_loss, 'b', label='Validation loss')\n",
    "plt.title('Training and validation loss')\n",
    "plt.legend()\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "3317eccb",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "a170be15",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "1d321b4d",
   "metadata": {},
   "outputs": [],
   "source": [
    "#change working directory\n",
    "os.chdir('C:\\\\Users\\\\oscar\\\\Documents\\\\MOMOCS\\\\FOUR_CARNIVORES\\\\models')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "4ba3e5ef",
   "metadata": {},
   "outputs": [],
   "source": [
    "#ENSEMBLE LEARNING"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "dfb3a6e9",
   "metadata": {},
   "outputs": [],
   "source": [
    "from keras.preprocessing import image\n",
    "import keras.backend as K\n",
    "import numpy as np\n",
    "import cv2\n",
    "import sys"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "d4d2864c",
   "metadata": {},
   "outputs": [],
   "source": [
    "#cargar modelo:\n",
    "from keras.models import model_from_json\n",
    "# cargar json y crear el modelo\n",
    "json_file = open('Resnet50-swish-Adagrad.json', 'r')\n",
    "loaded_model_json = json_file.read()\n",
    "json_file.close()\n",
    "model1 = model_from_json(loaded_model_json)#change sequentially\n",
    "# cargar pesos al nuevo modelo\n",
    "model1.load_weights(\"Resnet50-swish-Adagrad.h5\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "e63e43d1",
   "metadata": {},
   "outputs": [],
   "source": [
    "#cargar modelo:\n",
    "from keras.models import model_from_json\n",
    "# cargar json y crear el modelo\n",
    "json_file = open('densenet-relu-Adagrad.json', 'r')\n",
    "loaded_model_json = json_file.read()\n",
    "json_file.close()\n",
    "model2 = model_from_json(loaded_model_json)#change sequentially\n",
    "# cargar pesos al nuevo modelo\n",
    "model2.load_weights(\"densenet-relu-Adagrad.h5\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "6bb71a73",
   "metadata": {},
   "outputs": [],
   "source": [
    "#cargar modelo:\n",
    "from keras.models import model_from_json\n",
    "# cargar json y crear el modelo\n",
    "json_file = open('vgg19-swish-Adagrad.json', 'r')\n",
    "loaded_model_json = json_file.read()\n",
    "json_file.close()\n",
    "model3 = model_from_json(loaded_model_json)#change sequentially\n",
    "# cargar pesos al nuevo modelo\n",
    "model3.load_weights(\"vgg19-swish-Adagrad.h5\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "cb6b314f",
   "metadata": {},
   "outputs": [],
   "source": [
    "members=[model1,model2,model3]#actualizar!!!"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 113,
   "id": "aba3311a",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Stacked Test Accuracy: 0.804\n"
     ]
    }
   ],
   "source": [
    "from sklearn.model_selection import cross_val_score\n",
    "from sklearn.metrics import accuracy_score\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "from sklearn.ensemble import RandomForestClassifier\n",
    "from sklearn.ensemble import ExtraTreesClassifier\n",
    "from sklearn.ensemble import GradientBoostingClassifier\n",
    "from sklearn.ensemble import AdaBoostClassifier\n",
    "from sklearn.ensemble import BaggingClassifier\n",
    "from sklearn.neighbors import KNeighborsClassifier\n",
    "from keras.models import load_model\n",
    "from keras.utils import to_categorical\n",
    "from numpy import dstack\n",
    "\n",
    " \n",
    "# create stacked model input dataset as outputs from the ensemble\n",
    "def stacked_dataset(members, inputX):\n",
    "\tstackX = None\n",
    "\tfor model in members:\n",
    "\t\t# make prediction\n",
    "\t\tyhat = model.predict(inputX, verbose=0)\n",
    "\t\t# stack predictions into [rows, members, probabilities]\n",
    "\t\tif stackX is None:\n",
    "\t\t\tstackX = yhat\n",
    "\t\telse:\n",
    "\t\t\tstackX = dstack((stackX, yhat))\n",
    "\t# flatten predictions to [rows, members x probabilities]\n",
    "\tstackX = stackX.reshape((stackX.shape[0], stackX.shape[1]*stackX.shape[2]))\n",
    "\treturn stackX\n",
    " \n",
    "# fit a model based on the outputs from the ensemble members\n",
    "def fit_stacked_model(members, inputX, inputy):\n",
    "\t# create dataset using ensemble\n",
    "\tstackedX = stacked_dataset(members, inputX)\n",
    "\t# fit standalone model\n",
    "\t#model = LogisticRegression()#\n",
    "\t#model = RandomForestClassifier(n_estimators=100, max_depth=None,max_features=20,min_samples_split=2, random_state=0)# n_estimators=n of trees\n",
    "\tmodel = ExtraTreesClassifier()\n",
    "\t#model = GradientBoostingClassifier()\n",
    "\t#model = AdaBoostClassifier(n_estimators=100)\n",
    "\t#model = BaggingClassifier(KNeighborsClassifier(),max_samples=0.5, max_features=0.5)\n",
    "\tmodel.fit(stackedX, inputy)\n",
    "\treturn model\n",
    " \n",
    "# make a prediction with the stacked model\n",
    "def stacked_prediction(members, model, inputX):\n",
    "\t# create dataset using ensemble\n",
    "\tstackedX = stacked_dataset(members, inputX)\n",
    "\t# make a prediction\n",
    "\tyhat = model.predict(stackedX)\n",
    "\treturn yhat\n",
    " \n",
    "\n",
    "# fit stacked model using the ensemble\n",
    "model = fit_stacked_model(members, x_train, y_train)\n",
    "# evaluate model on test set\n",
    "yhat = stacked_prediction(members, model, x_test)\n",
    "acc = accuracy_score(y_test, yhat)\n",
    "print('Stacked Test Accuracy: %.3f' % acc)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 136,
   "id": "1101545d",
   "metadata": {},
   "outputs": [],
   "source": [
    "import pickle\n",
    "\n",
    "filename = \"stacked_model.pickle\"\n",
    "\n",
    "# save model\n",
    "pickle.dump(model, open(filename, \"wb\"))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 114,
   "id": "7a2912c5",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "              precision    recall  f1-score   support\n",
      "\n",
      "        croc       1.00      0.65      0.79        26\n",
      "       hyena       0.89      0.82      0.86        62\n",
      "     leopard       0.67      0.94      0.78        36\n",
      "        lion       0.94      0.74      0.83        39\n",
      "\n",
      "   micro avg       0.84      0.80      0.82       163\n",
      "   macro avg       0.87      0.79      0.81       163\n",
      "weighted avg       0.87      0.80      0.82       163\n",
      " samples avg       0.80      0.80      0.80       163\n",
      "\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\oscar\\anaconda3\\Lib\\site-packages\\sklearn\\metrics\\_classification.py:1469: UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in samples with no predicted labels. Use `zero_division` parameter to control this behavior.\n",
      "  _warn_prf(average, modifier, msg_start, len(result))\n"
     ]
    }
   ],
   "source": [
    "from sklearn.metrics import classification_report\n",
    "vp=np.round(yhat)\n",
    "vt=y_test\n",
    "target_names = [ \"croc\",'hyena','leopard', 'lion']\n",
    "print(classification_report(vt,vp,target_names=target_names))\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "5347ce07",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 153,
   "id": "8c7763e0",
   "metadata": {},
   "outputs": [],
   "source": [
    "#loads image to be classified. Activate libraries\n",
    "\n",
    "from tensorflow.keras.preprocessing import image\n",
    "import keras.backend as K\n",
    "import numpy as np\n",
    "import cv2\n",
    "import sys"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "c41736ea",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "25c3e03f",
   "metadata": {},
   "outputs": [],
   "source": [
    "#make independent model predictions"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "acf959d6",
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "from keras.applications.resnet50 import preprocess_input as preprocess_resnet50\n",
    "\n",
    "# Path to the folder containing images\n",
    "folder_path = 'C:\\\\Users\\\\oscar\\\\Documents\\\\MOMOCS\\\\select'\n",
    "\n",
    "# List all files in the folder\n",
    "image_files = os.listdir(folder_path)\n",
    "\n",
    "# Iterate over each image file\n",
    "for file_name in image_files:\n",
    "    # Load the image\n",
    "    img_path = os.path.join(folder_path, file_name)\n",
    "    img = image.load_img(img_path, target_size=(250, 200))\n",
    "\n",
    "    # Preprocess the image for ResNet50\n",
    "    img_resnet50 = image.img_to_array(img)\n",
    "    img_resnet50 = np.expand_dims(img_resnet50, axis=0)\n",
    "    img_resnet50 = preprocess_resnet50(img_resnet50)\n",
    "\n",
    "    # Make predictions with each model\n",
    "    prediction_resnet50 = members[0].predict(img_resnet50)\n",
    "    \n",
    "    # Extract label from the image file name\n",
    "    label = file_name.split('.')[0]  # Assuming the label is the part of the file name before the first period\n",
    "    \n",
    "    # Print the final prediction and the corresponding label\n",
    "    print('Prediction:', prediction_resnet50, 'Label:', label)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "id": "1b945126",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1/1 [==============================] - 0s 85ms/step\n",
      "1/1 [==============================] - 0s 65ms/step\n",
      "1/1 [==============================] - 0s 63ms/step\n",
      "1/1 [==============================] - 0s 62ms/step\n",
      "          Label                                         Prediction\n",
      "0   FKLKN+45+1+  [[0.0011018771, 0.97842133, 0.0044411197, 0.01...\n",
      "1   FLKN+410+3+  [[0.00070779334, 0.99411833, 0.0048674904, 0.0...\n",
      "2   FLKN+49d+3+  [[0.20154403, 0.49592334, 0.067333855, 0.23519...\n",
      "3  FLKN+811+13+  [[0.086325526, 0.89340276, 0.008510469, 0.0117...\n"
     ]
    }
   ],
   "source": [
    "import os\n",
    "import pandas as pd\n",
    "from keras.applications.resnet50 import preprocess_input as preprocess_resnet50\n",
    "\n",
    "# Path to the folder containing images\n",
    "folder_path = 'C:\\\\Users\\\\oscar\\\\Documents\\\\MOMOCS\\\\select2'\n",
    "\n",
    "# List all files in the folder\n",
    "image_files = os.listdir(folder_path)\n",
    "\n",
    "# Create lists to store results\n",
    "labels = []\n",
    "predictions = []\n",
    "\n",
    "# Iterate over each image file\n",
    "for file_name in image_files:\n",
    "    # Load the image\n",
    "    img_path = os.path.join(folder_path, file_name)\n",
    "    img = image.load_img(img_path, target_size=(250, 200))\n",
    "\n",
    "    # Preprocess the image for ResNet50\n",
    "    img_resnet50 = image.img_to_array(img)\n",
    "    img_resnet50 = np.expand_dims(img_resnet50, axis=0)\n",
    "    img_resnet50 = preprocess_resnet50(img_resnet50)\n",
    "\n",
    "    # Make predictions with each model\n",
    "    prediction_resnet50 = members[0].predict(img_resnet50)\n",
    "    \n",
    "    # Extract label from the image file name\n",
    "    label = file_name.split('.')[0]  # Assuming the label is the part of the file name before the first period\n",
    "    \n",
    "    # Append results to lists\n",
    "    labels.append(label)\n",
    "    predictions.append(prediction_resnet50)\n",
    "\n",
    "# Create a DataFrame\n",
    "results_df = pd.DataFrame({\n",
    "    'Label': labels,\n",
    "    'Prediction': predictions\n",
    "})\n",
    "\n",
    "# Print the DataFrame\n",
    "print(results_df)\n",
    "\n",
    "\n",
    "\n",
    "# Export the DataFrame to a CSV file in the folder_path\n",
    "#results_df.to_csv(os.path.join(folder_path, 'predictionsResnet.csv'), index=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "id": "bd3f6bb2",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1/1 [==============================] - 0s 121ms/step\n",
      "1/1 [==============================] - 0s 168ms/step\n",
      "1/1 [==============================] - 0s 139ms/step\n",
      "1/1 [==============================] - 0s 118ms/step\n",
      "          Label                                         Prediction\n",
      "0   FKLKN+45+1+  [[0.016972942, 0.960585, 0.004298272, 0.018143...\n",
      "1   FLKN+410+3+  [[0.08442394, 0.8966148, 0.003621311, 0.0153399]]\n",
      "2   FLKN+49d+3+  [[0.901319, 0.03879589, 0.021901509, 0.03798359]]\n",
      "3  FLKN+811+13+  [[0.12944134, 0.8490778, 0.015581769, 0.005899...\n"
     ]
    }
   ],
   "source": [
    "import os\n",
    "import pandas as pd\n",
    "from keras.applications.densenet import preprocess_input as preprocess_densenet\n",
    "\n",
    "# Path to the folder containing images\n",
    "folder_path = 'C:\\\\Users\\\\oscar\\\\Documents\\\\MOMOCS\\\\select2'\n",
    "\n",
    "# List all files in the folder\n",
    "image_files = os.listdir(folder_path)\n",
    "\n",
    "# Create lists to store results\n",
    "labels = []\n",
    "predictions = []\n",
    "\n",
    "# Iterate over each image file\n",
    "for file_name in image_files:\n",
    "    # Load the image\n",
    "    img_path = os.path.join(folder_path, file_name)\n",
    "    img = image.load_img(img_path, target_size=(250, 200))\n",
    "\n",
    "    # Preprocess the image for ResNet50\n",
    "    img_dense = image.img_to_array(img)\n",
    "    img_dense = np.expand_dims(img_dense, axis=0)\n",
    "    img_dense = preprocess_densenet(img_dense)\n",
    "\n",
    "    # Make predictions with each model\n",
    "    prediction_dense = members[1].predict(img_dense)\n",
    "    \n",
    "    # Extract label from the image file name\n",
    "    label = file_name.split('.')[0]  # Assuming the label is the part of the file name before the first period\n",
    "    \n",
    "    # Append results to lists\n",
    "    labels.append(label)\n",
    "    predictions.append(prediction_dense)\n",
    "\n",
    "# Create a DataFrame\n",
    "results_df = pd.DataFrame({\n",
    "    'Label': labels,\n",
    "    'Prediction': predictions\n",
    "})\n",
    "\n",
    "# Print the DataFrame\n",
    "print(results_df)\n",
    "\n",
    "\n",
    "\n",
    "# Export the DataFrame to a CSV file in the folder_path\n",
    "#results_df.to_csv(os.path.join(folder_path, 'predictionsResnet.csv'), index=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "id": "5d48d6b5",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1/1 [==============================] - 0s 83ms/step\n",
      "1/1 [==============================] - 0s 81ms/step\n",
      "1/1 [==============================] - 0s 78ms/step\n",
      "1/1 [==============================] - 0s 80ms/step\n",
      "          Label                                         Prediction\n",
      "0   FKLKN+45+1+  [[4.8993643e-05, 0.97984535, 0.014743663, 0.00...\n",
      "1   FLKN+410+3+  [[0.23927452, 0.75965506, 0.0008251995, 0.0002...\n",
      "2   FLKN+49d+3+  [[0.026008101, 0.3158335, 0.060618635, 0.59753...\n",
      "3  FLKN+811+13+  [[0.023932086, 0.96286744, 0.0007293139, 0.012...\n"
     ]
    }
   ],
   "source": [
    "import os\n",
    "from keras.applications.vgg19 import preprocess_input as preprocess_vgg19\n",
    "# Path to the folder containing images\n",
    "folder_path = 'C:\\\\Users\\\\oscar\\\\Documents\\\\MOMOCS\\\\select2'\n",
    "\n",
    "# List all files in the folder\n",
    "image_files = os.listdir(folder_path)\n",
    "\n",
    "# Create lists to store results\n",
    "labels = []\n",
    "predictions = []\n",
    "\n",
    "# Iterate over each image file\n",
    "for file_name in image_files:\n",
    "    # Load the image\n",
    "    img_path = os.path.join(folder_path, file_name)\n",
    "    img = image.load_img(img_path, target_size=(250, 200))\n",
    "\n",
    "    # Preprocess the image for Densenet\n",
    "    img_vgg = image.img_to_array(img)\n",
    "    img_vgg = np.expand_dims(img_vgg, axis=0)\n",
    "    img_vgg = preprocess_vgg19(img_vgg)\n",
    "\n",
    "    # Make predictions with each model\n",
    "    prediction_vgg = members[2].predict(img_vgg)\n",
    "    \n",
    "    # Extract label from the image file name\n",
    "    label = file_name.split('.')[0]  # Assuming the label is the part of the file name before the first period\n",
    "    \n",
    "        # Append results to lists\n",
    "    labels.append(label)\n",
    "    predictions.append(prediction_vgg)\n",
    "\n",
    "# Create a DataFrame\n",
    "results_df = pd.DataFrame({\n",
    "    'Label': labels,\n",
    "    'Prediction': predictions\n",
    "})\n",
    "\n",
    "# Print the DataFrame\n",
    "print(results_df)\n",
    "\n",
    "\n",
    "\n",
    "# Export the DataFrame to a CSV file in the folder_path\n",
    "#results_df.to_csv(os.path.join(folder_path, 'predictionsResnet.csv'), index=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "3606f53f",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "c5ed57bf",
   "metadata": {},
   "outputs": [],
   "source": [
    "#now ensemble the three models:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "244dccae",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1/1 [==============================] - 0s 61ms/step\n",
      "1/1 [==============================] - 0s 112ms/step\n",
      "1/1 [==============================] - 0s 69ms/step\n",
      "[[0.01997947 0.683821   0.26666063 0.02953891]]\n"
     ]
    }
   ],
   "source": [
    "from keras.preprocessing import image\n",
    "from keras.applications.resnet50 import preprocess_input as preprocess_resnet50\n",
    "from keras.applications.vgg19 import preprocess_input as preprocess_vgg19\n",
    "from keras.applications.densenet import preprocess_input as preprocess_densenet\n",
    "import numpy as np\n",
    "\n",
    "# Load the image\n",
    "img = image.load_img('C:\\\\Users\\\\oscar\\\\Documents\\\\MOMOCS\\\\select\\\\FKLKN+45+1+.bmp', target_size=(250, 200))\n",
    "\n",
    "# Preprocess the image for ResNet50\n",
    "img_resnet50 = image.img_to_array(img)\n",
    "img_resnet50 = np.expand_dims(img_resnet50, axis=0)\n",
    "img_resnet50 = preprocess_resnet50(img_resnet50)\n",
    "\n",
    "# Preprocess the image for VGG19\n",
    "img_vgg19 = image.img_to_array(img)\n",
    "img_vgg19 = np.expand_dims(img_vgg19, axis=0)\n",
    "img_vgg19 = preprocess_vgg19(img_vgg19)\n",
    "\n",
    "# Preprocess the image for DenseNet\n",
    "img_densenet = image.img_to_array(img)\n",
    "img_densenet = np.expand_dims(img_densenet, axis=0)\n",
    "img_densenet = preprocess_densenet(img_densenet)\n",
    "\n",
    "# Now, you can make predictions with each model in your ensemble\n",
    "# For example, if `members` is a list containing your three models\n",
    "prediction_resnet50 = members[0].predict(img_resnet50)\n",
    "prediction_densenet = members[1].predict(img_densenet)\n",
    "prediction_vgg19 = members[2].predict(img_vgg19)\n",
    "\n",
    "# Combine predictions according to your ensemble strategy\n",
    "# For example, you might average probabilities\n",
    "final_prediction = (prediction_resnet50 + prediction_vgg19 + prediction_densenet) / 3\n",
    "print(final_prediction)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "0ae32133",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[0.05771337 1.9989927  0.73263305 0.08566102]]\n"
     ]
    }
   ],
   "source": [
    "# Define the accuracies of the models\n",
    "accuracies = [80, 77, 73]\n",
    "\n",
    "# Find the maximum accuracy\n",
    "max_accuracy = max(accuracies)\n",
    "\n",
    "# Calculate the weights\n",
    "weights = [(accuracy / max_accuracy) for accuracy in accuracies]\n",
    "\n",
    "# Now you have the weights for each model\n",
    "# You can use these weights to combine the predictions\n",
    "weighted_prediction = (prediction_resnet50 * weights[0] +\n",
    "                       prediction_densenet * weights[1] +\n",
    "                       prediction_vgg19 * weights[2])\n",
    "\n",
    "print(weighted_prediction)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "822d2b11",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[0.02007421 0.69530183 0.2548289  0.02979514]]\n"
     ]
    }
   ],
   "source": [
    "# Define the accuracies of the models\n",
    "accuracies = [80, 77, 73]\n",
    "\n",
    "# Find the maximum accuracy\n",
    "max_accuracy = max(accuracies)\n",
    "\n",
    "# Calculate the weights\n",
    "weights = [(accuracy / max_accuracy) for accuracy in accuracies]\n",
    "\n",
    "# Now you have the weights for each model\n",
    "# You can use these weights to combine the predictions\n",
    "weighted_prediction = (prediction_resnet50 * weights[0] +\n",
    "                       prediction_densenet * weights[1] +\n",
    "                       prediction_vgg19 * weights[2])\n",
    "\n",
    "# Normalize the weighted prediction\n",
    "total_sum = weighted_prediction.sum()\n",
    "normalized_prediction = weighted_prediction / total_sum\n",
    "\n",
    "print(normalized_prediction)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 89,
   "id": "0f429070",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1/1 [==============================] - 0s 81ms/step\n",
      "1/1 [==============================] - 0s 123ms/step\n",
      "1/1 [==============================] - 0s 84ms/step\n",
      "[[0.01997947 0.683821   0.26666063 0.02953891]]\n",
      "1/1 [==============================] - 0s 72ms/step\n",
      "1/1 [==============================] - 0s 109ms/step\n",
      "1/1 [==============================] - 0s 88ms/step\n",
      "[[0.0168046  0.93213445 0.02103366 0.0300272 ]]\n",
      "1/1 [==============================] - 0s 74ms/step\n",
      "1/1 [==============================] - 0s 126ms/step\n",
      "1/1 [==============================] - 0s 83ms/step\n",
      "[[0.17767024 0.5407266  0.03123184 0.25037137]]\n",
      "1/1 [==============================] - 0s 58ms/step\n",
      "1/1 [==============================] - 0s 110ms/step\n",
      "1/1 [==============================] - 0s 68ms/step\n",
      "[[0.00944577 0.9015882  0.04601304 0.04295301]]\n"
     ]
    }
   ],
   "source": [
    "import os\n",
    "\n",
    "# Path to the folder containing images\n",
    "folder_path = 'C:\\\\Users\\\\oscar\\\\Documents\\\\MOMOCS\\\\select'\n",
    "\n",
    "# List all files in the folder\n",
    "image_files = os.listdir(folder_path)\n",
    "\n",
    "# Iterate over each image file\n",
    "for file_name in image_files:\n",
    "    # Load the image\n",
    "    img_path = os.path.join(folder_path, file_name)\n",
    "    img = image.load_img(img_path, target_size=(250, 200))\n",
    "\n",
    "    # Preprocess the image for ResNet50\n",
    "    img_resnet50 = image.img_to_array(img)\n",
    "    img_resnet50 = np.expand_dims(img_resnet50, axis=0)\n",
    "    img_resnet50 = preprocess_resnet50(img_resnet50)\n",
    "\n",
    "# Preprocess the image for VGG19\n",
    "    img_vgg19 = image.img_to_array(img)\n",
    "    img_vgg19 = np.expand_dims(img_vgg19, axis=0)\n",
    "    img_vgg19 = preprocess_vgg19(img_vgg19)\n",
    "\n",
    "# Preprocess the image for DenseNet\n",
    "    img_densenet = image.img_to_array(img)\n",
    "    img_densenet = np.expand_dims(img_densenet, axis=0)\n",
    "    img_densenet = preprocess_densenet(img_densenet)\n",
    "\n",
    "# Now, you can make predictions with each model in your ensemble\n",
    "# For example, if `members` is a list containing your three models\n",
    "    prediction_resnet50 = members[0].predict(img_resnet50)\n",
    "    prediction_densenet = members[1].predict(img_densenet)\n",
    "    prediction_vgg19 = members[2].predict(img_vgg19)\n",
    "\n",
    "    # Combine predictions according to the ensemble strategy\n",
    "    final_prediction = (prediction_resnet50 + prediction_vgg19 + prediction_densenet) / 3\n",
    "    print(final_prediction)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "id": "62d00b65",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1/1 [==============================] - 0s 67ms/step\n",
      "1/1 [==============================] - 0s 113ms/step\n",
      "1/1 [==============================] - 0s 86ms/step\n",
      "Prediction: [[0.00604127 0.97295064 0.00782769 0.01318045]] Label: FKLKN+45+1+\n",
      "Weighted Prediction: [[0.00607366 0.97290987 0.00764494 0.01337147]] Label: FKLKN+45+1+\n",
      "1/1 [==============================] - 0s 62ms/step\n",
      "1/1 [==============================] - 0s 121ms/step\n",
      "1/1 [==============================] - 0s 87ms/step\n",
      "Prediction: [[0.10813541 0.8834627  0.00310467 0.00529719]] Label: FLKN+410+3+\n",
      "Weighted Prediction: [[0.10397901 0.88753456 0.00317524 0.00531127]] Label: FLKN+410+3+\n",
      "1/1 [==============================] - 0s 70ms/step\n",
      "1/1 [==============================] - 0s 128ms/step\n",
      "1/1 [==============================] - 0s 88ms/step\n",
      "Prediction: [[0.3762904  0.28351757 0.04995133 0.2902407 ]] Label: FLKN+49d+3+\n",
      "Weighted Prediction: [[0.380007   0.28631458 0.05003108 0.28364733]] Label: FLKN+49d+3+\n",
      "1/1 [==============================] - 0s 63ms/step\n",
      "1/1 [==============================] - 0s 148ms/step\n",
      "1/1 [==============================] - 0s 84ms/step\n",
      "Prediction: [[0.07989965 0.9017827  0.00827385 0.01004381]] Label: FLKN+811+13+\n",
      "Weighted Prediction: [[0.0810429  0.90051305 0.00841789 0.01002616]] Label: FLKN+811+13+\n"
     ]
    }
   ],
   "source": [
    "import os\n",
    "\n",
    "# Define the accuracies of the models\n",
    "accuracies = [81, 77.3, 73]\n",
    "\n",
    "# Find the maximum accuracy\n",
    "max_accuracy = max(accuracies)\n",
    "\n",
    "# Calculate the weights\n",
    "weights = [(accuracy / max_accuracy) for accuracy in accuracies]\n",
    "\n",
    "\n",
    "\n",
    "# Path to the folder containing images\n",
    "folder_path = 'C:\\\\Users\\\\oscar\\\\Documents\\\\MOMOCS\\\\select2'\n",
    "\n",
    "# List all files in the folder\n",
    "image_files = os.listdir(folder_path)\n",
    "\n",
    "# Iterate over each image file\n",
    "for file_name in image_files:\n",
    "    # Load the image\n",
    "    img_path = os.path.join(folder_path, file_name)\n",
    "    img = image.load_img(img_path, target_size=(250, 200))\n",
    "\n",
    "    # Preprocess the image for ResNet50\n",
    "    img_resnet50 = image.img_to_array(img)\n",
    "    img_resnet50 = np.expand_dims(img_resnet50, axis=0)\n",
    "    img_resnet50 = preprocess_resnet50(img_resnet50)\n",
    "\n",
    "# Preprocess the image for VGG19\n",
    "    img_vgg19 = image.img_to_array(img)\n",
    "    img_vgg19 = np.expand_dims(img_vgg19, axis=0)\n",
    "    img_vgg19 = preprocess_vgg19(img_vgg19)\n",
    "\n",
    "# Preprocess the image for DenseNet\n",
    "    img_densenet = image.img_to_array(img)\n",
    "    img_densenet = np.expand_dims(img_densenet, axis=0)\n",
    "    img_densenet = preprocess_densenet(img_densenet)\n",
    "\n",
    "# Now, you can make predictions with each model in your ensemble\n",
    "# For example, if `members` is a list containing your three models\n",
    "    prediction_resnet50 = members[0].predict(img_resnet50)\n",
    "    prediction_densenet = members[1].predict(img_densenet)\n",
    "    prediction_vgg19 = members[2].predict(img_vgg19)\n",
    "\n",
    "    # Combine predictions according to the ensemble strategy\n",
    "    final_prediction = (prediction_resnet50 + prediction_vgg19 + prediction_densenet) / 3\n",
    "    \n",
    "    #weighted prediction\n",
    "    # Now you have the weights for each model\n",
    "    # You can use these weights to combine the predictions\n",
    "    weighted_prediction = (prediction_resnet50 * weights[0] +prediction_densenet * weights[1] +\n",
    "                       prediction_vgg19 * weights[2])\n",
    "    # Normalize the weighted prediction\n",
    "    total_sum = weighted_prediction.sum()\n",
    "    normalized_prediction = weighted_prediction / total_sum\n",
    "    \n",
    "    # Extract label from the image file name\n",
    "    label = file_name.split('.')[0]  # Assuming the label is the part of the file name before the first period\n",
    "    \n",
    "    # Print the final prediction and the corresponding label\n",
    "    print('Prediction:', final_prediction, 'Label:', label)\n",
    "    \n",
    "        # Print the final prediction and the corresponding label\n",
    "    print('Weighted Prediction:', normalized_prediction, 'Label:', label)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "e46dc0ce",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "fa32facd",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "95ce0023",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "95232c87",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "39ed88eb",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "8661d69f",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
